开发环境篇之HALCON数据结构
开发环境篇之HALCON基础
基本数据分类
Iconic图标类数据:
- Image 图片
- Region 区域
- XLD 轮廓
Control 控制类数据:
- string 字符串
- integer 整形
- real 浮点数
- handle 句柄
数组:
- Iconic数组(Objects)
最小索引为1,最大索引为数组长度 - Control数组(Control Tuple)
最小索引为0,最大索引为数组长度-1
长度是1时,可作为1个变量使用 - Vector数组,可包含Iconic数据和Iconic数组,或Control数据和Control数组
字典Dictionary
- 键值存储
- 单个容器内,可以存储任意Iconic和Control数据和数组
- 可同时包含Iconic(数组)和Control(数组)对象
图标类数据
一张图讲清楚3种Iconic数据:

Image(图片)
一张图讲清楚图片的3种概念:

Pixel:像素
在HALCON中,像素可以是不同的数据类型,用来表示各种不同信息。








Channel:通道
一张彩色图片由3个通道组成:

多光谱图片,可多达6个通道:

Domain:域
域可理解为ROI(感兴趣区域),大部分算子只会处理包含在域内的像素(不是所有算子):

图片的默认域是整个图片区域:

域可以裁剪:

图片操作
图片的读写
read_image(Image,'patras')
write_image(Image,'png',0,'C:/TEMP/MyImage')
注:可以是图片完整路径,如果仅仅是文件名则路径为 $HALCONIMAGES/patras.png ,保存文件时必须确保目标文件夹存在。
获取图片的属性:
get_image_type(Image,Type)
get_image_size(Image,ImageWidth,ImageHeight)
访问图片的通道:
count_channels(Image,NumChannels)
access_channel(Image,ImageRed,1)
access_channel(Image,ImageGreen,2)
access_channel(Image,ImageBlue,3)
查看图片灰度直方图:
HALCON有自带的工具,参考Halcon工具之灰度直方图。
访问和设置像素灰度:
get_grayval(Image,130,145,Grayval)
set_grayval(Image,130,145,[0,10,20])
查看图片的域:
默认域是整个图片
get_domain(Image,RegionDomain)
修改图片域:
reduce_domain设置的域只能是原有域的子区域
gen_circle(RegionCircle,200,200,200.5)
reduce_domain(Image,RegionCircle,ImageReduced)
change_domain设置的域可以大于原有域
gen_circle(RegionCircle,200,200,200.5)
reduce_domain(ImageReduced,RegionCircle,ImageReduced2)
Region(区域)
Region的多种形态:

Region的作用:
- 对象分割(blob分析)
- 用作图片域(Domain)
只处理域内像素
可缩短运算时间 - 用来寻找特征
Region的特点:
- 任意形状,可以是矩形、圆形,也可以是不规则图形
- 像素精度
- 游程编码方式:记录Region在每一行的起始列和终止列

Region操作
生成Region:
gen_circle(RegionCircle,200,200,100.5)
gen_rectangle1(RegionRect1,30,20,100,200)
gen_rectangle2(RegionRect2,300,200,rad(-30),100,20)
访问Region:
get_region_points(RegionRect1,RowsRect1,ColumnsRect1)
get_region_runs(RegionRect1,RunsRow,RunsColumnBegin,RunsColumnEnd)
area_center(RegionRect1,AreaRect1,_,_)
XLD(轮廓)
XLD(eXtended Line Description 轮廓)的特点:
- 由相互连接的点组成,可以是闭合的
- 亚像素精度
- 整数坐标是位于像素中心位置

XLD操作
XLD生成:
read_image(Image,'fabrik')
gen_contour_polygon_xld(Contour,[0,333],[0,222])
获取轮廓点:
get_contour_xld(Contour,Rows,Columns)
gen_cross_contour_xld(Cross,Rows,Columns,32,rad(45))
Control(控制类数据)
Integer(整形,Booleans,TYPE):
- 42、0、-1
- true/false
Real(浮点数Double):
- 3.141592、-5.3
- 1.#INF
String(字符数组)
- 由单括号包裹'string'
- 典型转义字符'Line1\nLine2'
- 路径使用反斜杠'C:/HALCON/images'
- 编码问题:HALCON18.11之前版本根据本地化设置(一般为Latin-1);HALCON18.11开始强制要求使用UTF-8
HALCON18.11之前:

HALCON18.11开始:

Handle(句柄):
- 类似指针,指向一个复杂的数据结构
- 数据类型:HALCON18.05之前包含一个Integer的控制类数组无引用计数,补在2使用的句柄,需要手动清除;HALCON18.05之后加入引用计数器,不在引用会自动清除,无需手动
注:tuple_type_elem算子可以返回元组元素的类型,具体类型值参考算子手册。
数据监视
handle目标数据结构,内部数据查看:
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

函数绘图:
X:=[0:359]
Y:=sin(rad(X))

数组
Iconic数组(Objects)
支持将Image、Region、XLD放入同个数组,要通过调用函数生成、插入和访问:
- Objects的生成和插入
gen_empty_obj(EmptyObject)
concat_obj(EmptyObject,Image,MyObjects)
concat_obj(MyObjects,Region,MyObjects)
concat_obj(MyObjects,XldEdges,MyObjects)
- 可直接读取多张图片,自动生成Objects
read_image(Image,'printer_chip/printer_chip_0'+[1,2,3,4])
count_obj(Images,NumberImages)
- Objects成员访问
select_obj(Images,Image1,1)
select_obj(Images,Image3,3)
Control数组(Tuple)
支持将Integer、Real、String变量放入同个数组,通过代码行直接操作:
- Tuple的生成和插入
A:=[1,2,'string',3.14]
A[4]=444
A[5]=555
- Tuple成员的访问
TpData:=A[index]
Vector数组
Iconic、Control类数据或者数组不支持放在同个容器,支持嵌套(vector内可包含vector),不能作为参数被算子调用:
- Vector的生成和插入
* Iconic对象和Iconic数组可以放入通过Vector
Vi:={Img1,Img2,Region,XLD}
Vi.insert(4,Img3)
* Control变量和Control数组可以放入同个Vector
Vc:={[1,2,'string'],3.14}
Vc.insert(2,123456)
- Vector成员的访问
VcData:=Vc.at(index)
Vector跟Tuple的区别:
Vector是一个类,Tuple则是普通数组
获取数组长度:Vc.length() tuple_length(Tp)
访问数组成员:Vc.at(index) Tp[index]Vector支持Iconic数据,Tuple只支持Control数据
Vector不可作为参数被算子调用,Tuple可以
Vector和Tuple可以互相转换
convert_tuple_to_vector_1d
convert_vector_to_tuple
字典
字典的特点:
- 键、值 存储方式
- 单个容器内,可以存储任意Iconic和Control数据和数组
- 越来越多地作为算子调用的参数
create_dict(InputFileDict1)
set_dict_tuple(InputFileDict1,'image_file',ImageFile)
set_dict_object(Image,InputFileDict1,'image')
扩展:坐标系和角度


参考资料
- 开发环境篇 第04讲 HALCON数据结构概览
- 开发环境篇 第05讲 HALCON 图标类数据之Image(图片)
- 开发环境篇 第06讲 HALCON 图标类数据之Region(区域)
- 开发环境篇 第07讲 HALCON 图标类数据之XLD(轮廓)
- 开发环境篇 第08讲 HALCON 控制类数据
- 开发环境篇 第09讲 HALCON 数据结构之数组和字典
开发环境篇之HALCON数据结构的更多相关文章
- .NET C#转Java没那么难,开发环境篇
.NET C#转Java没那么难,都是面向对向的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到MVC,都是一样一样的,只是JAVA的配制项比较多而已,只要配好一个,后面都是co ...
- Redis学习系列二之.Net开发环境搭建及基础数据结构String字符串
一.简介 Redis有5种基本数据结构,分别是string.list(列表).hash(字典).set(集合).zset(有序集合),这是必须掌握的5种基本数据结构.注意Redis作为一个键值对缓存系 ...
- Python 全栈开发 -- 开发环境篇
开发环境是一个文本编辑器和 Python 解释器的组合.文本编辑器用来写代码,解释器提供了一种方法来运行编写的代码.一个文本编辑器可以像 Windows 上的 Notepad 一样简单,或是一个复杂的 ...
- golang开发:环境篇(六) Go运行监控Supervisord的使用
为什么要使用Supervisord 17年第一次写Go项目的时候,用Go开发项目倒没没费多大劲,很快就开发完成了.到了在测试环境部署的时候,由于不知道有 Supervisord 这个软件,着实花了些功 ...
- golang开发:环境篇(四)包管理器 glide的使用
glide 是golang项目开发中是特别重要的软件,没有它,golang的项目可能都无法发布. 为什么要使用glide 平时我们开发Go项目的时候,使用第三方的包的时候都直接使用go get 去获取 ...
- golang开发:环境篇(五)实时加载工具gin的使用
gin 工具是golang开发中非常有用且有效的工具,有效的提高了开发调试go程序的效率. 为什么要使用gin 我们知道golang是编译型语言,这就表示go程序的每次改动,如果需要查看改动结果都必须 ...
- golang开发:环境篇(七) Go mod 使用
Glide用的好好的,为什么要使用Modules 在 Go 1.11 中 ,官方加入package management tool,称为Go Modules.Go mod 没有出现之前,用的最多的包管 ...
- C++学习之开发环境搭建篇(一)
由于C++是一门非跨平台语言,其开发的程序编译生成的可执行文件,只能在相应的操作系统中被执行,离开此系统环境将无法执行. 主要原因是不同的操作系统,可执行文件的结构不同,最为常见的操作系统是有:MAC ...
- Halcon开发环境和数据结构介绍——第1讲
1.Halcon是什么?如何初步了解Halcon? 这点我讲得不太好,不如给大家看看三个链接: ① Halcon官方网站:https://www.mvtec.com/products/halcon/ ...
- XE6移动开发环境搭建之IOS篇(8):在Mac OSX 10.8中安装XE6的PAServer(有图有真相)
网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 安装PAServer ...
随机推荐
- 46从零开始用Rust编写nginx,数据还能这么传,多层代理(IP多级代理)搭建
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...
- GA算法|遗传算法|SYSU期末课程设计|Python+Matlab实现|超完备代码实现
前言 那么这里博主先安利一下一些干货满满的专栏啦! Linux专栏https://blog.csdn.net/yu_cblog/category_11786077.html?spm=1001.2014 ...
- CF1045G AI robots题解
题目链接:洛谷 或者 CF 本题考虑转化为 cdq 分治模型 对于 cdq 分治来说,只需要考虑左边对右边的影响,那我们要考虑该怎样设置第一维度的左右对象.很显而易见的是抛开 \(q\) 限制而言,我 ...
- 一次人脸识别ViewFaceCore使用的经验分享,看我把门店淘汰下来的POS机改成了人脸考勤机
POS软件是什么?你好意思吗,还在用老掉牙的Winform. 门店被淘汰的POS机 销售终端--POS(point of sale)是一种多功能终端,把它安装在信用卡的特约商户和受理网点中与计算机联成 ...
- 文心一言 VS 讯飞星火 VS chatgpt (194)-- 算法导论14.3 2题
二.用go语言,改写 INTERVAL-SEARCH 的代码,使得当所有区间都是开区间时,它也能正确地工作. 文心一言,代码正常运行: 在Go语言中,处理开区间(open intervals)时,我们 ...
- Delphi实现登录窗体与主窗体的过程
登录窗体: type TfrmLogin = class(TForm) btn1: TButton; procedure btn1Click(Sender: TObject); private { P ...
- Kafka-生产者、broker、消费者的调优参数总结
生产环境下,为了尽可能提升Kafka的整体吞吐量,可以对Kafka的相关配置参数进行调整,以达到提升整体性能的目的. 本文主要从Kafka的不同组件出发,讲解各组件涉及的配置参数和参数含义. 一.生产 ...
- MySQL8-[问题解决]java.sql.SQLNonTransientConnectionException: Cannot load connection class because of underlying
对应为MySQL8和 MySQL-connecter8.0.16 1.修改MySQL驱动器 原来的版本: com.mysql.jdbc.Driver 现在改为:com.mysql.cj.jdbc.Dr ...
- MYSQL-另一种行转列的实现方式
行转列的实现方式:使用mysql.help_topic --行转列 SELECT b.help_topic_id, substring_index( a.levels, ',', b.help_top ...
- 《Learning from Context or Names?An Empirical Study on Neural Relation Extraction》论文阅读笔记
代码 原文地址 预备知识: 1.什么是对比学习? 对比学习是一种机器学习范例,将未标记的数据点相互并列,以教导模型哪些点相似,哪些点不同. 也就是说,顾名思义,样本相互对比,属于同一分布的样本在嵌入空 ...