Halcon的相机图像获取可以通过自身的函数来实现,也可以通过相机厂家的SDK来完成,由于不同品牌的相机SDK开发的具体实现各有不同,但我们都要面临将SDK采集到图像数据转换成halcon可识别的数据形式。
本文主要讲解使用在C#语言环境下,使用Halcon如何快速便捷的实现相机图像的转换。
常见的相机输出格式一般分为灰度图像, RGB图像,bayer图像,在采像完成的回调函数里也一般会返回一个IntPtr的数据指针
1.灰度图像数据
对于灰度图像比较简单,可以直接使用GenImage1函数完成,其中的type如果是8位的灰度图像可以选择”byte”。
void HImage.GenImage1(string type, int width, int height, IntPtr pixelPointer);
2.RGB图像数据
对于彩色图像大部分文章都指出要将IntPtr的数据通过Marshal.Copy函数将其转换成byte[] 数组,然后通过两个For循环分离出RGB三个通道的数据,在将byte[]数组转换成IntPtr,通过上面的GenImage1可以分别生成R/G/B的三个通道的图像,剩下的可以通过Compose3合成彩色图像,关于这部分的操作的文章网上很多,这里就不再赘述。
这一顿操作猛如虎,既涉及了数据的转换,还有自己的两个For循环,看似无比正确,实则是开发和运行效率双低的操作。如果你确定使用Halcon的图像库来开发完全没有必要如此操作,可以通过GenImageInterleaved,直接将回调函数输出的IntPtr数据指针带入即可完成
void HImage.GenImageInterleaved(IntPtr pixelPointer, string colorFormat, int originalWidth, int originalHeight, int alignment, string type, int imageWidth, int imageHeight, int startRow, int startColumn, int bitsPerChannel, int bitShift)
转换一幅4000*1024的图像,用第一种方式大概在80ms左右,而直接使用上面的函数基本在10ms左右,没有太多的操作,运行效率却高出许多。
3.Bayer图像数据
对于Bayer图像呢可以通过GenImage1生成灰度图像,然后通过CfaToRgb将bayer转换成相应的RGB图像,其中输入参数CFAType是图像的Bayer格式,一般可以在相机的采像软件上操作。
HImage HImage.CfaToRgb(string CFAType, string interpolation);