当前位置: 首页 > news >正文

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开始
HandleModelID(模板句柄)create_shape_model, clear_model需显式释放避免内存泄漏
IntegerWidth := 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 → XLDgen_contour_region_xldgen_contour_region_xld(Region, Contours, 'border')提取轮廓用于亚像素测量
XLD → 几何参数fit_*_contour_xldfit_circle_contour_xld(Contour, Algorithm, ... , Row, Col, Radius)拟合圆获取半径/圆心
Tuple → 字符串tuple_stringText := '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. 定位优先:通过模板匹配建立坐标系,消除工件位置偏差
  2. 测量与识别协同:先几何测量再缺陷识别,降低误检率
  3. 多算法融合:传统算法处理规则特征,深度学习应对复杂缺陷

五、综合例程解析(带详细注释)

例程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 分析空间关系,验证装配精度

六、最佳实践与避坑指南

  1. 数据结构选择原则

    • 快速分割Region(二值处理高效)
    • 精密测量XLD(亚像素精度)
    • 多参数传递Tuple(灵活存储数值/字符串)
  2. 算子组合黄金法则

    任务推荐算子组合优势
    高精度定位create_shape_model + reduce_domain限定ROI提升速度3倍
    微小缺陷dyn_threshold + connection自适应光照变化
    抗干扰识别find_data_code_2d + smallest_rectangle1几何特征验证解码结果
  3. 工程化陷阱

    • 内存泄漏:未清除Handle(clear_model)导致进程崩溃
    • 精度损失:用Region代替XLD测量,误差增加50%
    • 实时性差:未启用多线程(set_system('threads', n)

行业数据:在汽车零部件检测中,亚像素测量(XLD)将尺寸公差控制从±0.1mm提升至±0.02mm。

相关文章:

  • 算法学习笔记:2.大根堆算法——数据流的中位数​​or最后一块石头的重量
  • [Java恶补day23] 35. 搜索插入位置
  • 界面开发框架DevExpress XAF实践:集成.NET Aspire后如何实现服务安排?
  • ICMP协议深度解析
  • 安装 LibreOffice
  • 《一本书看透A股》速读笔记
  • 第三十八课:实战案例-飞鸟和飞机的识别
  • 《性能之巅》第三章 操作系统
  • AI时代,学习力进化指南:如何成为知识的主人?
  • Java(网络编程)
  • unittest 和 pytest 框架
  • 浅谈软件开发工作流
  • Vue3 Router 使用指南:从基础到高级用法
  • openEuler虚拟机中容器化部署
  • springboot+mybatis面试题
  • CQF预备知识:Python相关库 -- 插值过渡指南 scipy.interpolate
  • 接口测试常用工具及测试方法(基础篇)
  • [SKE]CPU 与 GPU 之间数据加密传输的认证与异常处理
  • 触觉智能RK3576核心板工业应用之软硬件全国产化,成功适配开源鸿蒙OpenHarmony5.0
  • aws s3 sdk c++使用指南、适配阿里云oss和aws
  • 今日合肥发现一例/优化推广seo
  • 赣州住房与城乡建设厅网站/天津关键词排名推广
  • 申报网站/游戏优化是什么意思?
  • 网站开发整套资料/广州百度首页优化
  • 西安网站建设优化/西安关键词seo公司
  • btoc的网站/seo课程培训中心