本文主要讨论,如何将数据从外设(相机),转换到Halcon对象,从而用Halcon进行后续的图像处理。
使用前, 我们先了解Halcon像素表示方式有以下几种:
不同于直接翻译文档,从使用场景的视角来分类,Halcon有以下几种图像初始化算子:
1. 灰度相机
1.1 重新分配内存
如果相机是灰度的,且原图像指针不直接使用。就用gen_image1,
我们来看一下这个算子的官方文档:
主要有3点信息:
1. 指针所指的图像数据是按线顺序存储,对于M列*N行的图像, 从第0列->第M-1列,然后从0行>N-1行的顺序进行存储; 这个约定的意义在于,就实现了2维图像到1维数组的转换。
2. Halcon会先进行内存分配,新的内存空间专属Halcon对象所属;
3. 原图像的PixelPointer指针可以立即释放;
4. 需要留意指针变量的系统位数。包括指针变量不要被截断,比如不要把64位的指针变量用32位的变量传递(这样高32位全部置零);
1.2 使用之前的内存空间
如果相机是灰度的,且直接使用原图像指针。就用gen_image1_extern算子,来看官方文档:
主要有3点信息:
1.内存不会被重新分配,直接使用之前的指针;因为内存的分配和释放会消耗时间和硬件性能, 同时也存在内存分配失败的可能,所以这个方法的效率和稳定性会更高
2. 原图像的PixelPointer指针所指的内存区域需要Halcon来释放。在C++中,调用ClearProc方法; 在C#中,可通过HObject.Dispose方法;
通常情况下,在一帧图像处理完后,我们就对图像的Halcon对象进行释放。以免进程达到内存上限。
2. 彩色相机
彩色相机的Halcon图像初始化,主要用这一种方法:gen_image_interleaved。不同于黑白相机图像,对于彩色图像的初始化,必须重新分配内存。
参考官方文档:
几点信息:
1. 内存会被重新分配;原图像的PixelPointer指针可以立即释放,其实也必须释放,否则进程的内存会一直增长;
2. 需要定义原图像的三通道格式,和Halcon对象的图像类型对应;图像类型的设置包括:
a. 图像位宽. Halcon图像格式支持byte(8位) 和 int2(16位)两种. 比如: RGB48的原图像需要用int2类型进行初始化;
b. 对于RGB48、BGR48等格式的原图像,通常每个通道没用完全部的16bit数据,可根据实际情况用BitShift对通道数据进行位移;
3. 通过定义Halcon图像的起始坐标,可以实现裁切图像,这个功能也是彩色图像格式所特有的;
以上就是最常用的几种Halcon图像初始化算子。通常情况下,我们先需要根据项目需求,配置相机的输出图像图像,再来进行Halcon算子的选择。
文章出处登录后可见!