Halcon HDevelop 核心语法与实战笔记
一、图像处理基础流程(区域分析示例)
read_image (Clip, 'clip.png') // 读取图像(需确保'clip.png'在可访问路径) threshold (Clip, Regions, 0, 100) // 阈值分割:提取灰度值0~100的像素区域 connection(Regions, ConnectedRegions) // 连通域分析:将区域分割为独立连通对象 select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 9000) // 按面积筛选
关键说明:
threshold是分割前景与背景的核心算子,阈值范围需根据图像灰度分布调整(可在 HDevelop 中通过灰度直方图工具可视化调整)。connection将相邻像素组成的区域拆分为独立对象,便于后续逐个分析。select_shape支持按面积、周长、圆度等多种特征筛选,此处保留面积 5000~9000 的区域(排除过小噪声和过大干扰)。
二、Halcon 基础语法规则
1. 变量与赋值
x:=10 // 数值赋值(使用 := 而非 =,= 用于条件判断) s:='aaa' // 字符串用单引号包裹,支持重新赋值 s:='A' // 覆盖原有字符串值
与 C# 对比:C# 用=赋值,Halcon 严格区分:=(赋值)和=(判断)。
2. 条件判断语句
// 等于与不等于判断 if(x=11) // x等于11时执行x:=666 endif if(x#11) // x不等于11时执行(# 对应C#的 !=)x:=666 endif // 逻辑运算 if (x<6 and s='A') // 逻辑与(and 对应C#的 &&) endif if (x<6 or s='A') // 逻辑或(or 对应C#的 ||) endif if (not(x=10)) // 逻辑非(not() 对应C#的 !) endif
3. 循环与分支结构
(1)for 循环
a:=100 for Index := 1 to 5 by 1 // 初始值1,终止值5,步长1(类似C#的for(int i=1;i<=5;i++))a:=a+10 // 循环结束后a=150 endfor
(2)while 循环
while (x) // 条件为x非0时持续执行(需在循环内修改x避免死循环) endwhile
(3)switch 分支
switch (x)case 1:a:=666break // 跳出分支case 5:a:=8888break endswitch
三、核心数据类型及操作
1. 句柄(Handle)
dev_get_window (WindowHandle) // 获取当前窗口句柄(唯一标识,类似指针)
作用:句柄用于引用复杂对象(窗口、相机、模型等),通过句柄高效操作资源,避免数据拷贝。
2. 图像、区域与轮廓
// 图像(Image):像素矩阵 read_image (Image, 'printer_chip/printer_chip_01') // 读取内置示例图像 // 区域(Region):像素集合 gen_rectangle1 (Rectangle, 30, 20, 200, 200) // 生成矩形区域(参数:左上角行、列,右下角行、列) // 轮廓(XLD):亚像素精度几何图形 gen_circle_contour_xld (ContCircle, 400, 400, 100, 0, 6.28318, 'positive', 1) // 参数:中心行、列,半径,起始角(0弧度),终止角(2π弧度),方向,采样步长
3. 元组(Tuple,动态数组)
(1)基础操作
nums:=[1,2,3,3,1] // 定义元组 x:=nums[1] // 索引访问(取第2个元素,值为2) nums[3]:=111 // 修改元素(第4个元素变为111) len:=|nums| // 元组长度(结果为5)
(2)批量生成
nums1:=[0:10] // 生成0~10连续整数(步长1) nums2:=[10:2:100] // 生成10~100,步长2(10,12,...,98) nums3:=[100:-2:10] // 生成100~10,步长-2(100,98,...,10)
(3)集合运算
list1:=[1,2,3] list2:=[4,-5,6] list3:=list1+list2 // 元素对应相加(结果[5,-3,9]) list3:=[list1,list2] // 拼接元组(结果[1,2,3,4,-5,6]) tuple_union (list1, list2, Union) // 并集(结果[1,2,3,4,-5,6]) n:=abs(Union) // 取绝对值(结果[1,2,3,4,5,6]) list6:=subset(list1,0) // 取索引0的元素(结果[1]) list7:=remove(Union,3) // 移除索引3的元素(结果[1,2,3,-5,6])
四、批量图像处理实战
// 列出文件夹中的所有图像文件
list_files ('C:/.../images/boxes', 'files', Files) // 替换为实际路径// 遍历并显示所有图像
for Index := 0 to |Files| -1 by 1read_image (Image1, Files[Index]) // 读取第Index个图像dev_open_window (0, 0, 512, 512, 'black', WindowHandle) // 创建512x512窗口dev_display (Image1) // 显示图像dev_close_window () // 关闭当前窗口dev_clear_window () // 清除窗口缓存
endfor应用场景:适用于批量浏览图像、统一预处理(如尺寸调整、滤波)等场景,通过元组长度|Files|控制循环次数。
五、HDevelop 使用技巧
算子提示:输入算子名后按
Tab自动补全参数,按F1查看官方文档。调试工具:单步执行(
F6)、断点设置(双击行号),在变量窗口实时查看数据变化。图像路径:内置示例图像路径通常为
C:\Users\Public\Documents\MVTec\HALCON-版本号\examples\images。
通过以上内容,可掌握 Halcon 的核心语法与图像处理基础流程,为复杂视觉项目开发奠定基础。
