Halcon 定义了自己独有的数据结构,本文记录相关内容。
简介 {#简介}
- HALCON 数据参数主要有图形参数 和控制参数 。其中,图形参数包括图像 、区域 、亚像素轮廓 ,控制参数包括数组 和字典。
图形参数 {#图形参数}
图像(Image) {#图像(Image)}
- 图像是图形参数的一种,图像通道可以看作一个二维数组,也是表示图像时所使用的数据结构。
- 该图像由很多个方格组成,每个方格称为像素,每一个方格用一个数值来表示,像素点的灰度值可取很多个数值,8 位图像取值范围为 0~255
- HALCON 的图像数据类型有 10 种:
| 类型 | 位深度 | 描述 | |-----------|---------|--------------------------------------------------------------------------------------------------| | byte | 8 bits | 图像无符号整型数据类型,存储的像素们的范围为0~255 | | direction | 8 bits | 它是一个存储方向的无符号整型数据类型(0 - 179),用来存储角度方向,上限是 180°,一般情况下方向是0~360°。如果用这种数据类型来保存数据,保存的角度信息是实际角度的一半 | | cyclic | 8 bits | 以循环的方式来存储的无符号整型数据,即如果灰度值超过了 255,数据又会从零开始不断地循环 | | int1 | 8 bits | 带符号整型数据类型,范围为 -127~128 | | complex | 64 bits | 数据类型:混合型的数据类型,包含实部和虚部两部分,是在复数存储时使用到的一个数据类型,相当于包含两个 real 值 | | int2 | 16 bits | 带符号 的整型数据类型,存储数据的范围为 -32767~32768 | | uint2 | 16 bits | 无符号的数据类型存储数据的范围为 0~65 535 | | int4 | 32 bits | 带符号 的整型数据类型,存储数据的范围是-2147483647~2147483648 | | int8 | 64 bits | 带符号 的整型数据类型,存储数据的范围是 -9223372036854775807-9223372036854775808 | | real | 32 bits | 带符号 的浮点型的实数数据类型,用于存储实数数据 |
区域(Region) {#区域(Region)}
-
图像处理的任务就是识别图像中的某些特征区域(Region),计算区域特征的时候,会把图像像素转换成区域来计算,这样可以减少资源的占用,方便存储和计算。区域是符合某些性质的像素子集,区域可以是任意的形状,单独的 1 像素也可以是区城。
-
区域在内存中都是逐行存储的,所以一般使用行程编码来实现区域的存储。行程编码和之前所说的图像压缩类似,就是把相同的数据用数字来代替。
例如 QQQWWWERR 可以写成 Q3W3ER2
-
行程编码的数据包含该行程的纵坐标,行程开始和行程结束对应的横坐标:
- 存储行程不仅节约存储空间还可以很好地管理行程。定义一个行程为一个区域,如果需要把多个行程合并为一个区域需要根据某种规则来合并行程,合并行程一般使用的是四连通区域和八连通区域的方式。
亚像素轮廓(XLD) {#亚像素轮廓(XLD)}
图像和区域最小的组成单位是像素,对于测量工具,例如钢尺,最小的测量单位是毫米但是可以通过估读的方式读到亚毫米级。
- 像素也是可以"估读"的,这就是所的亚像素级。HALCON 中使用 XLD 这个数据结构来存储和表示亚像索的数据。
- 下图表示是亚像素轮廓示意图,每一个方格代表一像素,方格代表轮廓像素,线代表亚像素轮廓,可以看到亚像素轮廓在像素内,但是并不是在中心,而且根据计算存在不同的点位。
- 亚像素轮廓带给我们更精确的点,从而在测量和定位当中提供更准确的图像位置。亚像素轮廓是一组有序的控制点的集合,数值为浮点型,精度一般为小数点后两位。亚像素轮廓是通过周围的像索插值计算得到的。
数据结构 {#数据结构}
- 亚像素轮廓的数据结构中包含了亚像素轮廓的很多属性。为了更好地描述边缘亚像素轮席,HALCON 规定了两种不同的亚像素轮廓:一种是插值计算的亚像素轮廓;另一种通过多边形通近方式得到的亚像素轮廓。亚像素轮廓(XLD轮廓)的数据结构如下:
控制参数 {#控制参数}
数组 {#数组}
-
有人认为 HALCON 的数组(Tuple)和 C 语言的数组是相同的,其实两者有所差别。C语言的数组只能存放一种变量,而且数组可以是二维的或三维的,而 HALCON 的数组就不太一样了。
-
在数据存储方而,可以认为 Tuple 是一个结构体,可以同时存储多种数据类型如字符串、整数和浮点数;在维度方面,Tuple 是一个单一维度的数组,它只能是一维数组而不像 C 语言中的数组那样进行多维度存储。
-
Tuple是一个用于数据存储的数据结构,一般情况下黑白图像 lmage区域 Region和像素轮(XLD)称为 HALCON 的对象,也就是 HObject。这些都是用来存储和图像有关的数据,而数值数据都是用 Tuple 来存储。
数组的赋值与创建 {#数组的赋值与创建}
-
定义一个空数组,代码如下:
-
给数组赋值并创建数组,代码如下
-
给指定数组元素赋值,代码如下
-
获取数组的长度,代码如下:
-
用函数方式获取数组长度,代码如下:
-
数组合并:
数组的存储与读取 {#数组的存储与读取}
HALCON 中的数组结果是可以直接存储的。
- 可以通过
write_tuple
这个函数来存储 Tuple 数值,该函数的第一个变量是需要存储数组,第二个变量是存储的地址,存储下来的文件后缀名为.tup
,可以用写字板的方式打开该文件。
字典 {#字典}
- 字典(Dictionary)是一个容器,是对于数据模型中键和键描述的集合,类似于通过联人名字查找联系人地址或联系人详细情况的地址簿,即把键(名字)和值(详细情况)联系在-起。键必须是唯一的,如果键重复,就无法找到正确的信息。
- 字典是由键和值组成的,键是这个集合的唯一标识,可以用不可变的字符申和数值来表示,值可以用可变的数值或字符串来表示。
- 在 HALCON 中字典的值可以是 HObjet,即图像、区域、亚像素轮;也可以是数组。键的值可以是数字和字符中,HALCON 中的字典还有一个句柄(Handle)作为这个字舞的标识。
- 字典这个数据结构主要用于深度学习。在 HALCON 的深度学习中,需要有很乡标记过的图像,也就是图像要有一个键来标识,这个结构就是字典的结构、当把很多图像标识好之后,就会形成一个字典集,这个字典集可以给算法提供数据。HALCON 中的深度学习算法都是使用字典来作为数据输入的。
- 也可以用数组和数组的索引来实现字典的功能,字典和数组对比,可以非常方便地通过键来搜索对应的值,键可以包含特殊含义,也更容易被人们记住。
字典的创建和操作 {#字典的创建和操作}
- 在 HALCON中,可以通过
create_dice
函数来创建字典,该函数的参数只有一个,即这个字典的句柄。 - 可以通过操作
set_dict_object
和set_dict_tuple
函数来向字典里面存入数据,存入数报的时候需要值、键和字典句柄。这两个函数共有 3 个变量:第一个变量是存入的值,第一个变量是句柄,第三个变量是键值。 - 可以通过
get_dict_object
和get_dict_tuple
函数来查询字典里面的数据,这两个函数的第一个变量是字典的句柄,第二个变量是键值,第三个变量是访问的值。可以通过remove_dict_key
函数来删除字典中的数据,这个函数的第一个变量是字典的句柄,第二个变量是数据的键。 - 可以通过
copy_dict
来复制字典,所有字典数据都是深度复制的。这个函数的第一个变量是要复制的句柄;第二个变量是复制时出现错误的种类。目前只有一种错误,即复制空句柄错误,这里用[]
来表示默认就可以了,也可单击下拉框来选择;第三个变量是这个错误类型处理方式,第一种方式是'true'
,是复制空句柄时,中断操作,第二种是'low_level'
,复制继续,错误类型交给system_set
来决定触发什么错误,第三种是'false'
,就是不触发错误,继续复制空句柄。
句柄 {#句柄}
- 句柄是指使用一个唯一的整数值,即一个4字节(64 位程序中为8字节)长的数值来标识应用程序中的不同对象和同类中的不同的实例,例如一个窗口、按钮、图标、滚动条、输出设备、控件或者文件等。当一个应用程序要引用其他系统所管理的内存块或对象时,就要使用句柄。应用程序能够通过句柄访问相应的对象信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不在 I/0文件中,它是毫无用处的。
- 句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。
- 在 HALCON 中有很多实例对象,例如标定、匹配、测量和窗口等都使用到了句柄,这些例子通过句柄来识别使用的是哪个对象。因为在程序中可能会出现多个匹配或者测量的对象,所以用句柄来标识,方便管理。
- 在 HALCON 中旬柄由数字和字母组成,共 12 位,数字和字母后面用一个括号表明这个句柄是用于哪一个对象类型,例如,H1C881D5FA10(window) 就是用于窗口的句柄 H1C881D5FA40(shape_model) 是用于模板匹配的句柄。
- 句柄是需要存储的,一般都是存储实例对象。因为每一次打开相同的程序,相同的对象的句柄也是不一样的,例如上面的窗口和模板匹配句柄,再次打开的时候,就变成了句柄 H24BE085FA10(window) 和句柄 H24BE085FA40(shape_model)。
参考资料 {#参考资料}
文章链接:
https://www.zywvvd.com/notes/coding/halcon/halcon-data-struct/halcon-data-struct/