前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Halcon 数据结构

Halcon 数据结构

作者头像
为为为什么
发布2023-01-30 15:27:37
发布2023-01-30 15:27:37
1.4K0
举报
文章被收录于专栏:又见苍岚又见苍岚

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

简介

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

图形参数

图像(Image)
  • 图像是图形参数的一种,图像通道可以看作一个二维数组,也是表示图像时所使用的数据结构。
  • 该图像由很多个方格组成,每个方格称为像素,每一个方格用一个数值来表示,像素点的灰度值可取很多个数值,8 位图像取值范围为 0~255
  • HALCON 的图像数据类型有 10 种:

类型

描述

byte

即8 位的图像数据类型,存储的像素们的范围为0~255

direction

它是一个存储方向的数据类型,用来存储角度方向,上限是 180°,一般情况下方向是0~360°。如果用这种数据类型来保存数据,保存的角度信息是实际角度的一半

cyclic

以循环的方式来存储数据,即如果灰度值超过了 255,数据又会从零开始不断地循环

int1

带符号的数据类型,范围为 -127~128

complex

数据类型:混合型的数据类型,包含实部和虚部两部分,是在复数存储时使用到的一个数据类型

int2

16 字节深度的数据类型,是带符号的数据类型,存储数据的范围为 -32767~32768

uint2

16 字节深度的数据类型,是不带符号的数据类型存储数据的范围为 0~65 535

int4

32 字节深度的数据类型,是带符号的数据类型,存储数据的范围是-2147483647~2147483648

int8

64 字节深度的数据类型,是带符号的数据类型,存储数据的范围是 -9223372036854775807-9223372036854775808

real

一个浮点型的实数数据类型,用于存储实数数据

区域(Region)
  • 图像处理的任务就是识别图像中的某些特征区域(Region),计算区域特征的时候,会把图像像素转换成区域来计算,这样可以减少资源的占用,方便存储和计算。区域是符合某些性质的像素子集,区域可以是任意的形状,单独的 1 像素也可以是区城。
  • 区域在内存中都是逐行存储的,所以一般使用行程编码来实现区域的存储。行程编码和之前所说的图像压缩类似,就是把相同的数据用数字来代替。 例如 QQQWWWERR 可以写成 Q3W3ER2
  • 行程编码的数据包含该行程的纵坐标,行程开始和行程结束对应的横坐标:
  • 存储行程不仅节约存储空间还可以很好地管理行程。定义一个行程为一个区域,如果需要把多个行程合并为一个区域需要根据某种规则来合并行程,合并行程一般使用的是四连通区域和八连通区域的方式。
亚像素轮廓(XLD)

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

  • 像素也是可以“估读”的,这就是所的亚像素级。HALCON 中使用 XLD 这个数据结构来存储和表示亚像索的数据。
  • 下图表示是亚像素轮廓示意图,每一个方格代表一像素,方格代表轮廓像素,线代表亚像素轮廓,可以看到亚像素轮廓在像素内,但是并不是在中心,而且根据计算存在不同的点位。
  • 亚像素轮廓带给我们更精确的点,从而在测量和定位当中提供更准确的图像位置。亚像素轮廓是一组有序的控制点的集合,数值为浮点型,精度一般为小数点后两位。亚像素轮廓是通过周围的像索插值计算得到的。
数据结构
  • 亚像素轮廓的数据结构中包含了亚像素轮廓的很多属性。为了更好地描述边缘亚像素轮席,HALCON 规定了两种不同的亚像素轮廓:一种是插值计算的亚像素轮廓;另一种通过多边形通近方式得到的亚像素轮廓。亚像素轮廓(XLD轮廓)的数据结构如下:

12345678910111213

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)。

参考资料

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年12月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 图形参数
    • 图像(Image)
    • 区域(Region)
    • 亚像素轮廓(XLD)
      • 数据结构
  • 控制参数
    • 数组
      • 数组的赋值与创建
      • 数组的存储与读取
    • 字典
      • 字典的创建和操作
  • 句柄
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档