Halcon 数据结构

本文最后更新于:2022年12月27日 下午

Halcon 定义了自己独有的数据结构,本文记录相关内容。

简介

  • HALCON 数据参数主要有图形参数控制参数。其中,图形参数包括图像区域亚像素轮廓,控制参数包括数组字典

图形参数

图像(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),计算区域特征的时候,会把图像像素转换成区域来计算,这样可以减少资源的占用,方便存储和计算。区域是符合某些性质的像素子集,区域可以是任意的形状,单独的 1 像素也可以是区城。

  • 区域在内存中都是逐行存储的,所以一般使用行程编码来实现区域的存储。行程编码和之前所说的图像压缩类似,就是把相同的数据用数字来代替。

    例如 QQQWWWERR 可以写成 Q3W3ER2

  • 行程编码的数据包含该行程的纵坐标,行程开始和行程结束对应的横坐标:

  • 存储行程不仅节约存储空间还可以很好地管理行程。定义一个行程为一个区域,如果需要把多个行程合并为一个区域需要根据某种规则来合并行程,合并行程一般使用的是四连通区域和八连通区域的方式。

亚像素轮廓(XLD)

图像和区域最小的组成单位是像素,对于测量工具,例如钢尺,最小的测量单位是毫米但是可以通过估读的方式读到亚毫米级。

  • 像素也是可以“估读”的,这就是所的亚像素级。HALCON 中使用 XLD 这个数据结构来存储和表示亚像索的数据。
  • 下图表示是亚像素轮廓示意图,每一个方格代表一像素,方格代表轮廓像素,线代表亚像素轮廓,可以看到亚像素轮廓在像素内,但是并不是在中心,而且根据计算存在不同的点位。

  • 亚像素轮廓带给我们更精确的点,从而在测量和定位当中提供更准确的图像位置。亚像素轮廓是一组有序的控制点的集合,数值为浮点型,精度一般为小数点后两位。亚像素轮廓是通过周围的像索插值计算得到的。
数据结构
  • 亚像素轮廓的数据结构中包含了亚像素轮廓的很多属性。为了更好地描述边缘亚像素轮席,HALCON 规定了两种不同的亚像素轮廓:一种是插值计算的亚像素轮廓;另一种通过多边形通近方式得到的亚像素轮廓。亚像素轮廓(XLD轮廓)的数据结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct con_type
{
HITEMCNT num; //XLD 轮廓点的数量
HSUBCOOK * row; //XID轮廓点的行坐标
HSUBCOOK * column; //XLD 轮廓点的列坐标

Hcont_class location; //XID 轮廓是否交叉和交叉的位置
INT4 num_attrib; //附加属性的个数
Hcont attrib * attribs; //XLD 轮脉附加属性
INT4 num_global; //XLD 轮廓附加全局属性个数
Hcont_global_attrib *attrib; //XLD轮附加全局属性
INT4 h; //辅助属性
)Hcont;

控制参数

数组

  • 有人认为 HALCON 的数组(Tuple)和 C 语言的数组是相同的,其实两者有所差别。C语言的数组只能存放一种变量,而且数组可以是二维的或三维的,而 HALCON 的数组就不太一样了。

  • 在数据存储方而,可以认为 Tuple 是一个结构体,可以同时存储多种数据类型如字符串、整数和浮点数;在维度方面,Tuple 是一个单一维度的数组,它只能是一维数组而不像 C 语言中的数组那样进行多维度存储。

  • Tuple是一个用于数据存储的数据结构,一般情况下黑白图像 lmage区域 Region和像素轮(XLD)称为 HALCON 的对象,也就是 HObject。这些都是用来存储和图像有关的数据,而数值数据都是用 Tuple 来存储。

数组的赋值与创建
  • 定义一个空数组,代码如下:

    1
    Tuple:=[]
  • 给数组赋值并创建数组,代码如下

    1
    Tuple:=[l, 'a", 2.1]
  • 给指定数组元素赋值,代码如下

    1
    Tuple[1]=0
  • 获取数组的长度,代码如下:

1
Number: = |Tuplel|
  • 用函数方式获取数组长度,代码如下:

    1
    tuple_length(Tuple, Length2)
  • 数组合并:

    1
    tuple1 := [tuple1, tuple2, '3']
数组的存储与读取

HALCON 中的数组结果是可以直接存储的。

  • 可以通过 write_tuple 这个函数来存储 Tuple 数值,该函数的第一个变量是需要存储数组,第二个变量是存储的地址,存储下来的文件后缀名为.tup,可以用写字板的方式打开该文件。

字典

  • 字典(Dictionary)是一个容器,是对于数据模型中键和键描述的集合,类似于通过联人名字查找联系人地址或联系人详细情况的地址簿,即把键(名字)和值(详细情况)联系在-起。键必须是唯一的,如果键重复,就无法找到正确的信息。
  • 字典是由键和值组成的,键是这个集合的唯一标识,可以用不可变的字符申和数值来表示,值可以用可变的数值或字符串来表示。
  • 在 HALCON 中字典的值可以是 HObjet,即图像、区域、亚像素轮;也可以是数组。键的值可以是数字和字符中,HALCON 中的字典还有一个句柄(Handle)作为这个字舞的标识。
  • 字典这个数据结构主要用于深度学习。在 HALCON 的深度学习中,需要有很乡标记过的图像,也就是图像要有一个键来标识,这个结构就是字典的结构、当把很多图像标识好之后,就会形成一个字典集,这个字典集可以给算法提供数据。HALCON 中的深度学习算法都是使用字典来作为数据输入的。
  • 也可以用数组和数组的索引来实现字典的功能,字典和数组对比,可以非常方便地通过键来搜索对应的值,键可以包含特殊含义,也更容易被人们记住。
字典的创建和操作
  • 在 HALCON中,可以通过 create_dice 函数来创建字典,该函数的参数只有一个,即这个字典的句柄。
  • 可以通过操作 set_dict_objectset_dict_tuple 函数来向字典里面存入数据,存入数报的时候需要值、键和字典句柄。这两个函数共有 3 个变量:第一个变量是存入的值,第一个变量是句柄,第三个变量是键值。
  • 可以通过 get_dict_objectget_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)。

参考资料


Halcon 数据结构
https://www.zywvvd.com/notes/coding/halcon/halcon-data-struct/halcon-data-struct/
作者
Yiwei Zhang
发布于
2022年12月16日
许可协议