【机械视觉】Halcon—【一、Halcon的介绍和基础语法】
目录
介绍
Halcon 主要特点
Halcon 典型应用场景
Halcon 脚本语言语法
1. HDevelop 中的编程语言
2. 外部语言调用 Halcon 库
3. 关键区别
4. 如何选择?
一. 基本语法规则
(1) 语句结束
(2) 注释
二. 变量与数据类型
变量的运用
变量命名
三. 算子(函数)调用
常见算子分类
四. 控制结构
(1) 条件语句(if-else)
(2) 循环(for/while)
五. 元组
元组:类似数组,但元素类型可混合。
元组常用的操作
六.字典
1. 字典基本概念
七. 错误处理
调试技巧
介绍
Halcon 是由德国 MVTec Software GmbH 公司开发的一款 机器视觉软件,广泛应用于工业检测、医学成像、机器人引导、三维视觉等领域。它提供强大的图像处理和分析功能,支持快速开发高效的机器视觉应用。
Halcon 主要特点
-
强大的图像处理算法库
-
包含 1800+ 图像处理算子,涵盖:
-
图像预处理(滤波、增强)
-
特征提取(边缘、角点、纹理)
-
模式匹配(形状、轮廓、深度学习)
-
3D视觉(立体视觉、结构光、点云处理)
-
条码/二维码识别(OCR、条形码、DataMatrix)
-
-
-
跨平台支持
-
支持 Windows、Linux、macOS,并可部署在嵌入式设备(如ARM架构)。
-
-
多语言集成
-
提供 C++、C#、Python、VB.NET 等接口,方便与现有系统集成。
-
-
深度学习支持
-
集成 深度学习 功能(如分类、目标检测、语义分割),支持训练和推理。
-
-
高性能计算
-
利用 GPU加速(通过CUDA、OpenCL)和 多核CPU并行计算,适合实时处理。
-
-
灵活的授权方式
-
提供 永久授权 和 订阅制,支持运行时免版税部署。
-
Halcon 典型应用场景
-
工业检测:缺陷检测、尺寸测量、装配验证。
-
机器人引导:定位抓取、视觉伺服。
-
医疗影像:细胞分析、X光检测。
-
物流:包裹分拣、条码识别。
-
自动驾驶:车道识别、障碍物检测。
Halcon 脚本语言语法
Halcon 程序窗口(即其开发环境 HDevelop)使用 Halcon 自有的脚本语言(类似一种领域特定语言,DSL),同时支持通过其他编程语言(如 C++、C#、Python 等)调用其库函数。以下是详细说明:
1. HDevelop 中的编程语言
-
Halcon 脚本语言
-
HDevelop 是 Halcon 的集成开发环境(IDE),其默认使用 Halcon 自有的脚本语言(文件扩展名为
.hdev
)。 -
语法简洁,专为图像处理设计,直接调用 Halcon 算子(如
read_image
,threshold
,find_shape_model
)。 -
示例代码:
read_image(Image, 'particle.jpg') // 读取图像 threshold(Image, Region, 128, 255) // 阈值分割 connection(Region, ConnectedRegions) // 区域连通 count_obj(ConnectedRegions, NumParticles) // 计数
-
特点:
-
无需编译,直接运行调试。
-
支持图形化交互(如 ROI 绘制、结果可视化)。
-
-
-
导出为其他语言
-
HDevelop 支持将脚本自动转换为 C++、C#、VB.NET、Python 等语言,方便集成到实际项目中。
(通过菜单文件 -> 导出
实现)
-
2. 外部语言调用 Halcon 库
Halcon 的核心功能可以通过以下语言调用(需安装 Halcon 库和对应接口):
-
C++:通过
halconcpp
库。 -
C#:通过
halcondotnet
库。 -
Python:通过
python-halcon
模块(如import halcon
)。 -
其他:VB.NET、Java(通过 JNI)等。
Python 示例:
import halcon as ha# 调用Halcon算子
image = ha.read_image("particle.jpg")
region = ha.threshold(image, 128, 255)
num_particles = ha.count_obj(region)
print("粒子数量:", num_particles)
3. 关键区别
场景 | 使用的语言 | 说明 |
---|---|---|
HDevelop 快速原型开发 | Halcon 脚本语言 (.hdev ) | 适合算法调试、可视化交互。 |
实际项目集成 | C++/C#/Python 等 | 通过 Halcon 库调用,需导出代码。 |
嵌入式部署 | C/C++(Runtime 环境) | 需购买 Halcon 运行时授权。 |
4. 如何选择?
-
初学者/算法验证:直接用 HDevelop 脚本语言,快速测试算子。
-
工业项目:导出为 C++/C# 嵌入到现有系统。
-
深度学习结合:Python + Halcon 库(如训练模型后部署)。
一. 基本语法规则
(1) 语句结束
-
每行一条语句,无需分号(除非一行写多条语句,用分号隔开)。
read_image(Image, 'particle.jpg') // 正确 threshold(Image, Region, 128, 255); connection(Region, ConnectedRegions) // 分号分隔
(2) 注释
-
单行注释:*
-
二. 变量与数据类型
Halcon 变量类型自动推断,常见类型包括:
类型 | 示例 | 说明 |
---|---|---|
图像(Image) | Image , GrayImage | 单通道/多通道图像矩阵。 |
区域(Region) | Region , ConnectedRegions | 二值化后的像素集合。 |
轮廓(XLD) | Contours , Edges | 亚像素精度的边缘轮廓。 |
数值(Number) | Width , Area | 整数或浮点数。 |
字符串(String) | FileName , ModelName | 文本数据。 |
示例:
read_image(Image, 'particle.jpg') // Image 是图像类型变量
threshold(Image, Region, 128, 255) // Region 是区域类型变量
area_center(Region, Area, Row, Column) // Area, Row, Column 是数值类型
变量的运用
- 在halcon中使用:=进行变量赋值
-
* 整形 a:=10* 浮点类型 b:=10.1* 把整形转为浮点类型 c:=real(a)* 把浮点类型转成整型 d:=int(b)* 向下求整 e:=floor(b)* 向上求整 f:=ceil(b)* 四舍五入 g:=round(b)* 字符串类型 h:='90' * 转成数字类型 i:=number(h)* 转成字符串 i:=a+''
变量命名
-
变量名以字母开头,可包含字母、数字、下划线。
-
区分大小写(
Image
和image
不同)。 -
无需显式声明类型(动态类型)。
三. 算子(函数)调用
Halcon 的核心功能通过算子(Operators)实现,语法为:
算子名(输入参数1, 输入参数2, ..., 输出参数1, 输出参数2, ...)
常见算子分类
类别 | 示例算子 | 作用 |
---|---|---|
图像输入/输出 | read_image , write_image | 读取/保存图像。 |
预处理 | gauss_filter , median_image | 滤波、去噪。 |
分割 | threshold , regiongrowing | 阈值分割、区域生长。 |
特征提取 | edges_sub_pix , find_shape_model | 边缘检测、模板匹配。 |
数学运算 | add_image , mult_image | 图像加减乘除。 |
示例:
read_image(Image, 'chip.png') // 读取图像
rgb1_to_gray(Image, GrayImage) // 转为灰度图
threshold(GrayImage, Region, 0, 100) // 阈值分割
connection(Region, ConnectedRegions) // 区域连通
count_obj(ConnectedRegions, NumChips) // 计数
四. 控制结构
(1) 条件语句(if-else)
if (条件)// 语句块
elif (条件)// 语句块
else// 语句块
endif
示例:
* 基本if语句
if (Area > 100)disp_message('Large object found', 'window', 12, 12, 'black', 'true')
endif* if-else结构
if (Score > 0.8)disp_message('Match found', 'window', 12, 12, 'green', 'true')
elsedisp_message('No match', 'window', 12, 12, 'red', 'true')
endif* 多条件判断
if (Area > 100 and Circularity > 0.9)classification := 'Circle'
elif (Area > 50 and Area <= 100)classification := 'Small Object'
elseclassification := 'Unknown'
endif
(2) 循环(for/while)
-
for 循环:
for Index := 1 to 10 by 1// 循环体 endfor
-
while 循环:
while (条件)// 循环体 endwhile
示例:
for i := 1 to 5 by 1disp_message('当前次数:' + i, 'window', 20*i, 12, 'black', 'true')
endfor
五. 元组
-
元组:类似数组,但元素类型可混合。
Tuple := ['apple', 123, 3.14, true]
-
元组常用的操作
* 1 创建元组 -元素为整形数字
nums:=[1,2,3,4,5,6,7]* 2 获取元组的元素 通过索引值
x:=nums[2]* 3 获取元组的长度 | |
len:=|nums|* 4 遍历元组
for Index := 0 to |nums|-1 by 1num:=nums[Index]
endfor* 5 批量创建元组的元素
nums1:=[0:10]* 6 [a:b:c] 元素范围是a到c,每次递增b
nums2:=[0:3:9]
* 也可以反着来
nums3:=[9:-3:0] * 8 可以把变量重新定义成元组
str:='a'
str[0,1,2]:='ac'* 9 元组合并
list1:=[1,2,3]
list2:=['a','b','c']
list3:=[list1,list2]* 10 元组并集: 去掉重复的元素
* 参数1 要合并的元组
* 参数2 要合并的元素
* 参数3 合并之后元组
tuple_union(list3,num,Union)* 11 元组的交集: 获取两者之间相同的
tuple_intersection (list1,nums,val1)* 12 元组的插入元素
tuple_insert(list1,2,list2,val2)* 13 从元组中截取元素,从索引值为1开始截取,截取长度为3
list8:=list3[1:3]* 14 移除元素 指定位置移除
list8:= remove(list8,2)* 15 获取指定位置元素
list8:=subset(list8,1)* 16 绝对值
tuple_abs (-50,ABs)*嵌套数组
* a5 有4个元素,分别为1 2 3 [4,5,6]
a5:=[1,2,3,[4,5,6]]
* 按照嵌套元组的方式取出
c1:=a5[3]* 把元组所有的元素加1操作
A6:= a5+1* 把元组所有的元素乘以操作
A7:= a5*5* 把元组转成字符串结构
cc:=['1','2','3']
tuple_join (cc,',',JoinedStrings)* 批量赋值
A8[0,1,3]:=99* 随机0-1之间的数字
tuple_rand(10,Rand)
六.字典
1. 字典基本概念
字典是Halcon 20.11引入的高级数据结构,用于键值对存储:
* 1 创建字典 字典名称为aaa
create_dict(aaa)
* 2 给字典设置键值对
* 参数1 要设置的字典
* 参数2 键
* 参数3 值
set_dict_tuple(aaa,'v',10)
set_dict_tuple(aaa,'v2','hello')
set_dict_tuple(aaa,'v3',[1,2,3])
* 3 设置键值对(值为对象)
* 参数1 添加的对象
* 参数2 添加的目标字典
* 参数3 键
set_dict_object(rectangle,aaa,'v4')* 如果俩个键一样,去替换之前值
set_dict_object (rectangle1,aaa,'v4')
* 4 复制字典
copy_dict(aaa,[],[],bbb)
* 5 获取字典中的值
* 参数1 输出的对象
* 参数2 字典
* 参数3 键
get_dict_object(object,bbb,'v4')
* 6 获取字典值元组类型
* 参数1 目标字典
* 参数2 获取值的键
* 参数3 输出值
get_dict_tuple (bbb,'v3',Tuple)
* 7 获取字典当中所有的键存储在一个元组里面
* 参数1 目标字典
* 参数2 keys 获取字典里面所有的key
* 参数3 可选参数
* 参数4 输出的元组
get_dict_param(bbb,'keys',[],GenParamValue)
* 8 删除键值对
remove_dict_key (bbb,'v4')
七. 错误处理
使用 try-catch
捕获异常:
tryread_image(Image, 'nonexist.jpg') // 可能失败
catch (Exception)disp_message('错误:文件不存在!', 'window', 12, 12, 'red', 'true')
endtry
调试技巧
变量窗口:HDevelop 中可实时查看变量值。
单步执行:按 F6 逐行调试。
可视化:右键算子可显示图像/区域/轮廓。
本文主要介绍一些基础语法,下期全面讲述算子!