Halcon图像标注实战:用gen_rectangle2和gen_ellipse高效创建自定义ROI区域
在工业视觉检测项目中,精确标注感兴趣区域(ROI)往往是算法成功的第一步。当面对不规则摆放的电子元件、倾斜的包装盒或椭圆形的机械零件时,传统的水平矩形标注工具(如gen_rectangle1)常常会引入过多背景干扰,导致后续特征提取不准确。本文将深入探讨如何利用Halcon的gen_rectangle2(任意角度矩形)和gen_ellipse(椭圆)两大工具,配合concat_obj的组合技,构建高精度的自定义ROI方案。
1. 为什么需要超越水平矩形标注?
典型的PCB板检测案例中,芯片往往以不同角度排列在电路板上。使用gen_rectangle1标注时,工程师不得不选择两种妥协方案:要么扩大矩形范围以覆盖旋转后的芯片(引入大量背景噪声),要么针对每个角度创建多个矩形模板(增加维护成本)。
三种标注方式对比:
| 标注类型 | 适用场景 | 优势 | 局限性 |
|---|---|---|---|
| gen_rectangle1 | 水平/垂直摆放的规则物体 | 参数简单,计算速度快 | 无法适应旋转物体 |
| gen_rectangle2 | 任意角度摆放的矩形物体 | 方向可调,贴合目标边缘 | 需要计算角度参数 |
| gen_ellipse | 圆形/椭圆形物体 | 完美匹配弧形边缘 | 参数理解成本较高 |
实际测试数据表明,对30度倾斜的IC芯片使用gen_rectangle2标注,相比gen_rectangle1可使后续Blob分析的特征信噪比提升47%。
2. gen_rectangle2的核心参数实战解析
任意角度矩形的核心在于理解其几何参数体系。与常见的"左上角+右下角"定义方式不同,gen_rectangle2采用中心坐标系:
* 语法示例:创建30度倾斜的矩形 gen_rectangle2( Rectangle, // 输出区域对象 512, // 中心行坐标(y) 768, // 中心列坐标(x) rad(30), // 旋转角度(弧度制) 150, // 长边一半长度 75 // 短边一半长度 )参数设置技巧:
角度(Phi)的常见误区:
- 该参数表示矩形长轴与图像水平轴的夹角
- 使用
rad()函数将角度转为弧度,如rad(45)表示45度 - 建议配合
draw_rectangle2交互绘制获取初始值
Length1与Length2的判定:
- Length1始终对应与Phi方向平行的边
- 可通过以下代码验证方向:
gen_rectangle2(Rect, 300, 300, rad(45), 100, 50) gen_contour_polygon_xld(Contour, Rect) dev_display(Contour)
动态调整策略:
* 根据最小外接矩形自动适配参数 smallest_rectangle2(Region, Row, Column, Phi, Length1, Length2) gen_rectangle2(AdjustedRect, Row, Column, Phi, Length1*1.2, Length2*1.2)
3. gen_ellipse的工业应用技巧
椭圆标注在环形零件检测、瓶口定位等场景中具有不可替代的价值。其参数系统比矩形更复杂:
* 创建长轴半径150,短轴半径80,倾斜15度的椭圆 gen_ellipse( Ellipse, 500, // 中心y 800, // 中心x rad(15), // 长轴角度 150, // 长轴半径 80 // 短轴半径 )典型应用场景:
- 圆形度检测:通过比较Ellipse与实际轮廓的差异度判断加工质量
- 局部ROI标注:只检测瓶口螺纹区域时,椭圆比矩形更精准
- 组合形状构建:多个椭圆叠加可模拟齿轮、法兰等复杂轮廓
参数优化建议:
- 当Radius1 ≈ Radius2时,系统会自动优化为圆形处理
- 对于高精度测量,建议配合
fit_ellipse_contour_xld进行二次拟合 - 可通过以下代码验证椭圆方向:
gen_ellipse(Ellipse, 300, 300, rad(30), 200, 100) ellipse_axis(Ellipse, MajorAxis, MinorAxis) dev_display(MajorAxis) // 显示长轴方向
4. 复杂ROI的组合与优化策略
实际项目中,经常需要将多种形状组合使用。Halcon的concat_obj算子支持将多个区域合并为统一ROI:
* 创建基础区域 gen_empty_obj(ComplexROI) * 添加矩形区域 gen_rectangle2(Rect1, 300, 500, rad(15), 120, 60) concat_obj(ComplexROI, Rect1, ComplexROI) * 添加椭圆区域 gen_ellipse(Ellipse1, 700, 600, rad(0), 180, 90) concat_obj(ComplexROI, Ellipse1, ComplexROI) * 最终显示 dev_display(Image) dev_display(ComplexROI)高级组合技巧:
布尔运算增强:
* 创建环形区域(大圆减去小圆) gen_circle(OuterCircle, 500, 500, 200) gen_circle(InnerCircle, 500, 500, 150) difference(OuterCircle, InnerCircle, RingRegion)动态ROI生成:
* 根据模板匹配结果自动生成ROI find_shape_model(Image, ModelID, ..., Row, Column, Angle, Score) gen_rectangle2(DynamicROI, Row, Column, Angle, 100, 50)性能优化方案:
- 对静态ROI使用
reduce_domain提前裁剪处理区域 - 对组合区域使用
union1合并相邻区域 - 复杂形状建议保存为.hobj文件避免重复计算
- 对静态ROI使用
5. 工程实践中的避坑指南
在多个汽车零部件检测项目中,我们总结了以下经验:
- 坐标系统一:确保所有gen_*算子的坐标单位一致,混合使用像素/毫米单位是常见错误源
- 内存管理:及时使用
clear_obj释放不再使用的区域对象 - 可视化调试:
* 显示ROI轮廓而非填充区域 gen_contour_polygon_xld(RectContour, Rectangle2) dev_set_color('green') dev_set_line_width(3) dev_display(RectContour) - 参数持久化:将关键参数保存为JSON/CSV文件,便于不同检测工位间同步
针对特殊场景的解决方案:
- 当处理反光金属件时,适当扩大ROI范围补偿边缘膨胀
- 对于柔性材料变形,采用
elliptic_axis动态调整椭圆参数 - 高速检测场景下,优先使用
gen_rectangle1+affine_trans_region组合方案