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

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
PCI Perspectives
PCI Perspectives
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google Online Security Blog
Google Online Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The GitHub Blog
The GitHub Blog
S
Secure Thoughts
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
WordPress大学
WordPress大学
SecWiki News
SecWiki News
B
Blog
小众软件
小众软件
Hacker News - Newest:
Hacker News - Newest: "LLM"
Webroot Blog
Webroot Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
L
LINUX DO - 热门话题
Recent Commits to openclaw:main
Recent Commits to openclaw:main
酷 壳 – CoolShell
酷 壳 – CoolShell
IT之家
IT之家
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
Know Your Adversary
Know Your Adversary
Y
Y Combinator Blog
F
Fortinet All Blogs
W
WeLiveSecurity
博客园 - Franky
MongoDB | Blog
MongoDB | Blog
Last Week in AI
Last Week in AI
The Last Watchdog
The Last Watchdog
S
Schneier on Security
爱范儿
爱范儿
V
V2EX - 技术
L
LINUX DO - 最新话题
月光博客
月光博客
博客园 - 【当耐特】
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
U
Unit 42
Schneier on Security
Schneier on Security
E
Exploit-DB.com RSS Feed
J
Java Code Geeks
Cyberwarzone
Cyberwarzone
T
The Blog of Author Tim Ferriss
TaoSecurity Blog
TaoSecurity Blog
博客园 - 叶小钗
T
Troy Hunt's Blog
大猫的无限游戏
大猫的无限游戏
AI
AI
Security Latest
Security Latest

又见苍岚

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 安装下载与黑屏问题解决方案 全局路径规划算法记录 2025 Python 版本性能测试 Flutter Hello World Flutter 安装环境配置 Ubuntu VMware 硬盘扩容后 SMBus Host controller not enabled 报错问题解决 Python NetworkX 教程 Docker GPU 报错 - Failed to initialize NVML Unknown Error 解决方案 Python matplotlib 图表绘制 cuda-toolkit 安装替代 Cuda 与 Cudnn Jinja2 Python 利用 docxtpl 和 Jinja2 生成基于模板的 Word 文档 Docker 实现 CPU 核心隔离 LoFTR 基于 Transformer 的特征提取匹配算法 OmniGlue 特征匹配 SuperGlue 使用图神经网络学习特征匹配 Ubuntu 下将 xlsx 文件按照 sheet 转换为 图片 Python 使用 SQLAlchemy Python FastAPI 教程 openwrt 软路由配置安装 Nav2 地图文件(PGM/YAML)规范标准 3D OBJ 模型转换为 glb 瓦片格式 Python 源码 Redis 数据库介绍 Ubuntu 22.04 内核自动升级导致 MongoDB 7.0.12 错误记录 ubuntu 20.04 安装 ROS Noetic ubuntu 18.04 安装 ROS Melodic VMware Workstation Pro 个人免费版下载、安装、使用指南 Hybrid A-star 路径规划 Reeds-Shepp 曲线 Dubins 曲线 Linux kvm 虚拟机网络不通的问题解决方法 Ubuntu 自动内存清理 BiliBili 缓存视频转 mp4 Python 求解线性规划 3D Gaussian Splatting 官方源码实践记录 ImageMagick 教程 Ubuntu 22.04 安装 Colmap 对数几率 odds Ubuntu nmcli 网络管理工具使用指南 SuperPoint 自监督深度学习特征点提取 SyncTV Music Tag Web 在线音乐信息整理工具 ncm 格式转 mp3 MusicBrainz 音乐元数据百科数据库 Ubuntu 网络流量监控工具 私人云音乐平台 Navidrome 入门 手眼标定 四元数(Quaternions) OHTTPS 实现免费自动 https 证书申请、更新、部署 ubuntu 22.04 安装 CloudCompare 单机 KVM 虚拟机冷迁移 Ubuntu 22.04 使用 mdadm 实现软 raid 小鱼 一键安装 ROS-humble Fluid -46- 基于 Simpletex API 构建公式识别页面 公式识别 API 简介 -- Simpletex 使用 Python web 部署库 waitress 3D Gaussian Splatting for Real-Time Radiance Field Rendering Ubuntu Swap 简介与空间扩展 Ubuntu 24.04 安装 forticlient Clash Verge 使用 MongoDB 7.0.17 集群 Docker 构建源码 Error code - 2013. Lost connection to MySQL server during query 问题解决 Python 日志记录库 loguru 使用指北 Python 实现 Web 日志查看服务 MySQL LOAD DATA LOCAL INFILE 极速数据加载 Image size exceeds limit of 89478485 pixels 解决方案 Docker 使用 NVIDIA GPU 驱动错误解决 阿里云 docker 镜像仓库 Ubuntu中没有wired connected的解决方案 MinIO 简介 subconverter 代理订阅格式转换 修复 node –openssl-legacy-provider is not allowed in NODE_OPTIONS 错误
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/