HALCON第一讲->数据结构、语法规则与思路
文章目录
- 一、数据结构:机器视觉的基石
- **1. Iconic 数据:图像与特征载体**
- **2. Control 数据:流程控制核心**
- 二、语法规则与类型转换
- **1. 基础语法结构**
- **2. 关键类型转换技术**
- 三、高级特性:工程化核心能力
- **1. 深度学习集成**
- **2. 3D视觉处理**
- **3. 性能优化技巧**
- 四、检测思路:工业级解决方案设计
- **标准流程**
- 检测目标
- 完整代码与注释
- 检测思路拆解
- **关键策略**
- 五、综合例程解析(带详细注释)
- **例程1:精密零件尺寸测量与缺陷检测**
- **例程2:二维码识别与物料分拣**
- **例程3:复杂背景下的多目标识别与定位**
- 六、最佳实践与避坑指南
一、数据结构:机器视觉的基石
HALCON的数据分为 Iconic(图形数据) 和 Control(控制数据) 两类,二者协同支撑视觉处理流程。
1. Iconic 数据:图像与特征载体
类型 | 存储内容 | 关键算子 | 应用场景 | 转换场景 |
---|---|---|---|---|
Image | 像素矩阵(灰度/多通道) | read_image , rgb1_to_gray | 图像滤波、色彩分析 | →Region(阈值分割) |
Region | 连通像素集合(二值掩码) | threshold , connection | 目标分割、区域筛选 | →XLD(轮廓提取) |
XLD | 亚像素轮廓(有序点集) | edges_sub_pix , fit_circle_contour_xld | 精密测量、形状匹配 | →Tuple(几何参数) |
典型转换链:
Image
→(threshold
)→Region
→(gen_contour_region_xld
)→XLD
→(fit_circle_contour_xld
)→ 圆心坐标(Tuple
)
目的:从像素级分割升级至亚像素测量,精度提升10倍。
2. Control 数据:流程控制核心
类型 | 示例 | 操作方式 | 注意事项 |
---|---|---|---|
Tuple | [1, 2.5, 'OK'] | tuple_select , tuple_concat | 动态类型,索引从0开始 |
Handle | ModelID (模板句柄) | create_shape_model , clear_model | 需显式释放避免内存泄漏 |
Integer | Width := 640 | 直接运算 | 支持int() /real() 类型转换 |
二、语法规则与类型转换
1. 基础语法结构
* 条件分支与循环控制
if (DefectArea > Threshold)dev_display(DefectRegion) * 显示缺陷区域
elsedisp_message('Pass', 'window', 10, 10, 'green')
endif* 遍历多个ROI(Region转Tuple索引)
Regions := [Region1, Region2, Region3]
for i := 0 to |Regions| - 1 by 1area_center(Regions[i], Area, Row, Col) * 计算每个区域面积中心
endfor
2. 关键类型转换技术
转换目的 | 算子 | 示例 | 作用 |
---|---|---|---|
Region → XLD | gen_contour_region_xld | gen_contour_region_xld(Region, Contours, 'border') | 提取轮廓用于亚像素测量 |
XLD → 几何参数 | fit_*_contour_xld | fit_circle_contour_xld(Contour, Algorithm, ... , Row, Col, Radius) | 拟合圆获取半径/圆心 |
Tuple → 字符串 | tuple_string | Text := 'Radius=' + Radius$'.2f' | 结果可视化 |
三、高级特性:工程化核心能力
1. 深度学习集成
* 加载模型并推理
read_dl_model('defect_classifier.hdl', DLModel)
apply_dl_model(Image, DLModel, DefectType, Confidence)* 结果过滤与报警
if (DefectType == 'scratch' and Confidence > 0.9)sound_alarm() * 触发声光报警
endif
优势:处理低对比度缺陷(如透明物体划痕),传统算法难以稳定检测。
2. 3D视觉处理
* 点云匹配与位姿估计
read_object_model_3d('gear.ply', ObjectModel3D)
surface_matching(ObjectModel3D, SceneModel, Pose, Score) * ICP算法
应用场景:汽车零部件装配引导,精度达±0.1mm。
3. 性能优化技巧
- 减少计算量:
reduce_domain(Image, ROI, ImageReduced)
限定处理区域 - 并行加速:
set_system('threads', 8)
启用多线程 - 资源释放:
clear_shape_model(ModelID)
避免内存泄漏
四、检测思路:工业级解决方案设计
标准流程
graph TD
A[图像采集] --> B(预处理:滤波/增强)
B --> C{目标定位}
C -->|模板匹配| D[形状匹配]
C -->|深度学习| E[目标检测]
D --> F[几何测量]
E --> F
F --> G[缺陷分析]
G --> H[结果输出]
检测目标
尺寸测量:孔径直径、中心距
缺陷检测:表面划痕、缺失孔洞
完整代码与注释
* 1. 初始化与图像采集
dev_close_window ()
read_image (Image, 'metal_part') * 读取零件图像
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)* 2. 图像预处理(降噪+增强)
gauss_filter (Image, Smoothed, 5) * 高斯滤波去噪[1](@ref)
emphasize (Smoothed, Enhanced, 7, 7, 1) * 增强边缘对比度* 3. 定位基准孔(模板匹配)
* 创建模板
gen_rectangle1 (ROI, 200, 300, 400, 500)
reduce_domain (Enhanced, ROI, TemplateImage)
create_shape_model (TemplateImage, 'auto', 0, 0, 'auto', 'auto', ModelID)* 搜索模板
find_shape_model (Enhanced, ModelID, 0, 0, 0.8, Row, Column, Angle, Score)
if (|Score| == 0)throw ('定位失败!')
endif* 4. 尺寸测量(亚像素边缘)
* 测量孔径
gen_measure_arc (Row, Column, Angle, 100, 0, 6.28318, 'arc', MeasureHandle)
measure_pos (Enhanced, MeasureHandle, 2, 30, 'all', ArcEdges, _, _)
diameter := 2 * max(ArcEdges.Distance) * 计算直径* 5. 缺陷检测(动态阈值)
* 检测表面划痕
dyn_threshold (Enhanced, Smoothed, Scratches, 15, 'dark')
connection (Scratches, ConnectedScratches)
select_shape (ConnectedScratches, FinalScratches, 'area', 'and', 100, 10000)* 6. 结果判定与可视化
dev_display (Enhanced)
if (diameter < 9.8 or diameter > 10.2)dev_set_color ('red')disp_message ('孔径超差: ' + diameter$'.2f' + 'mm', 'window', 50, 50)
elsedev_set_color ('green')
endifif (|FinalScratches| > 0)dev_set_color ('red')dev_display (FinalScratches)disp_message ('发现划痕数量: ' + |FinalScratches|, 'window', 100, 50)
endif
检测思路拆解
1.定位优先:通过模板匹配(find_shape_model)确定基准位置,建立坐标系
2.亚像素测量:使用测量工具(gen_measure_arc)获取高精度几何尺寸
3.缺陷分离:动态阈值(dyn_threshold)适应光照变化,精准提取微小划痕
4.分级判定:尺寸公差(±0.2mm)与缺陷数量双重判断标准
关键策略
- 定位优先:通过模板匹配建立坐标系,消除工件位置偏差
- 测量与识别协同:先几何测量再缺陷识别,降低误检率
- 多算法融合:传统算法处理规则特征,深度学习应对复杂缺陷
五、综合例程解析(带详细注释)
例程1:精密零件尺寸测量与缺陷检测
* 1. 图像采集与预处理
read_image (Image, 'metal_part')
gauss_filter (Image, Smoothed, 7) * 高斯滤波抑制噪声* 2. 定位基准孔(模板匹配)
create_shape_model (Smoothed, 'auto', 0, rad(360), 'auto', 'auto', ModelID)
find_shape_model (Smoothed, ModelID, 0, rad(360), 0.8, Row, Column, Angle, Score)* 3. 孔径测量(亚像素边缘)
gen_measure_arc (Row, Column, Angle, 50, 0, 6.28, 'arc', MeasureHandle)
measure_pos (Smoothed, MeasureHandle, 1, 30, 'all', EdgeRows, EdgeCols, _)
fit_circle_contour_xld (gen_contour_polygon_xld(EdgeRows, EdgeCols), 'algebraic', -1, 0, 0, _, RowCenter, ColCenter, Radius, _)* 4. 表面划痕检测(动态阈值)
dyn_threshold (Smoothed, median_image(Smoothed, Median, 15, 15), Scratches, 15, 'dark')
connection (Scratches, ConnectedScratches)
select_shape (ConnectedScratches, FinalScratches, 'area', 'and', 50, 1000)* 5. 结果判定
Diameter := 2 * Radius
is_defective := (Diameter < 9.8 or Diameter > 10.2) or (|FinalScratches| > 0)
设计解析:
- 定位:
create_shape_model
解决工件位置随机性 - 测量:
measure_pos
+fit_circle_contour_xld
实现亚像素级孔径测量(精度±0.01mm) - 检测:
dyn_threshold
自适应光照变化,避免固定阈值失效
例程2:二维码识别与物料分拣
* 1. 图像增强
emphasize (Image, Enhanced, 10, 10, 2) * 增强对比度* 2. 二维码定位与识别
create_data_code_2d_model ('QR Code', [], [], DataCodeHandle)
find_data_code_2d (Enhanced, SymbolXLDs, DataCodeHandle, 'stop_after_result_num', 1, ResultHandles, DecodedData)* 3. 尺寸校验(最小外接矩形)
smallest_rectangle1 (SymbolXLDs, Row1, Col1, Row2, Col2)
Width := Col2 - Col1
Height := Row2 - Row1* 4. 分拣决策
if (string(DecodedData) == 'A001' and Width > 50 and Height > 50)activate_pneumatic_arm('bin_A') * 气动臂分拣至A箱
endif
设计解析:
- 识别:
find_data_code_2d
直接解码二维码,鲁棒性强于传统OCR - 测量:
smallest_rectangle1
验证物理尺寸,避免标签变形 - 协同:解码数据与几何尺寸双重验证,提升分拣可靠性
例程3:复杂背景下的多目标识别与定位
* 1. 深度学习目标检测
read_dl_model ('yolov5.hdl', DLModel)
apply_dl_model (Image, DLModel, DLResult)* 2. 提取检测结果(Tuple转Region)
get_dl_model_result (DLResult, 'instance', 'bbox', BBoxes)
gen_rectangle1 (Regions, BBoxes[0], BBoxes[1], BBoxes[2], BBoxes[3]) * 将边界框转为Region* 3. 位置关系分析
distance_pairs (Regions, Distances, 'closest_point') * 计算两两间距
max_distance := max(Distances)* 4. 装配完整性判定
if (|Regions| == 4 and max_distance < 100.0)disp_message ('Assembly Complete', 'window', 10, 10, 'green')
endif
设计解析:
- 识别:YOLO模型处理背景干扰(如油污、反光)
- 转换:
gen_rectangle1
将边界框(Tuple)转为Region,便于几何计算 - 测量:
distance_pairs
分析空间关系,验证装配精度
六、最佳实践与避坑指南
-
数据结构选择原则
- 快速分割 →
Region
(二值处理高效) - 精密测量 →
XLD
(亚像素精度) - 多参数传递 →
Tuple
(灵活存储数值/字符串)
- 快速分割 →
-
算子组合黄金法则
任务 推荐算子组合 优势 高精度定位 create_shape_model
+reduce_domain
限定ROI提升速度3倍 微小缺陷 dyn_threshold
+connection
自适应光照变化 抗干扰识别 find_data_code_2d
+smallest_rectangle1
几何特征验证解码结果 -
工程化陷阱
- 内存泄漏:未清除Handle(
clear_model
)导致进程崩溃 - 精度损失:用
Region
代替XLD
测量,误差增加50% - 实时性差:未启用多线程(
set_system('threads', n)
)
- 内存泄漏:未清除Handle(
行业数据:在汽车零部件检测中,亚像素测量(XLD)将尺寸公差控制从±0.1mm提升至±0.02mm。