Halcon(二)-图像初始化的几种方式

本文主要讨论,如何将数据从外设(相机),转换到Halcon对象,从而用Halcon进行后续的图像处理。

使用前, 我们先了解Halcon像素表示方式有以下几种:

Halcon(二)-图像初始化的几种方式

不同于直接翻译文档,从使用场景的视角来分类,Halcon有以下几种图像初始化算子:

1. 灰度相机

1.1 重新分配内存

如果相机是灰度的,且原图像指针不直接使用。就用gen_image1,

我们来看一下这个算子的官方文档:

Halcon(二)-图像初始化的几种方式

主要有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算子,来看官方文档:

Halcon(二)-图像初始化的几种方式

主要有3点信息:

1.内存不会被重新分配,直接使用之前的指针;因为内存的分配和释放会消耗时间和硬件性能, 同时也存在内存分配失败的可能,所以这个方法的效率和稳定性会更高

2. 原图像的PixelPointer指针所指的内存区域需要Halcon来释放。在C++中,调用ClearProc方法; 在C#中,可通过HObject.Dispose方法;

通常情况下,在一帧图像处理完后,我们就对图像的Halcon对象进行释放。以免进程达到内存上限。

2. 彩色相机

彩色相机的Halcon图像初始化,主要用这一种方法:gen_image_interleaved。不同于黑白相机图像,对于彩色图像的初始化,必须重新分配内存。

参考官方文档:

Halcon(二)-图像初始化的几种方式

几点信息:

1. 内存会被重新分配;原图像的PixelPointer指针可以立即释放,其实也必须释放,否则进程的内存会一直增长;

2. 需要定义原图像的三通道格式,和Halcon对象的图像类型对应;图像类型的设置包括:

a. 图像位宽. Halcon图像格式支持byte(8位) 和 int2(16位)两种. 比如: RGB48的原图像需要用int2类型进行初始化;

b. 对于RGB48、BGR48等格式的原图像,通常每个通道没用完全部的16bit数据,可根据实际情况用BitShift对通道数据进行位移;

3. 通过定义Halcon图像的起始坐标,可以实现裁切图像,这个功能也是彩色图像格式所特有的;

以上就是最常用的几种Halcon图像初始化算子。通常情况下,我们先需要根据项目需求,配置相机的输出图像图像,再来进行Halcon算子的选择。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年3月29日 下午6:15
下一篇 2022年3月29日 下午6:28

相关推荐