惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
WordPress大学
WordPress大学
U
Unit 42
I
InfoQ
A
About on SuperTechFans
宝玉的分享
宝玉的分享
J
Java Code Geeks
博客园 - 司徒正美
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
G
Google Developers Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
腾讯CDC
Recent Announcements
Recent Announcements

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录
Halcon 数据结构
Yiwei Zhang · 2022-12-16 · via 又见苍岚

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

参考资料

文章链接:
https://www.zywvvd.com/notes/coding/halcon/halcon-data-struct/halcon-data-struct/