4. ROI与模板对齐稳定性优化
在工业视觉检测中,产品在视野内的位置、角度和尺度几乎不可能每次都完全一致。传送带上的轻微抖动、机械手放料偏差、镜头畸变、料盘间隙,都会让同一型号的产品在图像中呈现不同的位姿。如果检测区域(ROI)固定不动,而产品发生位移或旋转,原本落在ROI内的特征就可能移出边界,导致漏检;反过来,ROI内混入背景或相邻产品,又会造成误检。因此,ROI与模板对齐的稳定性,直接决定了检测系统的鲁棒性。
HALCON提供了从模板匹配到形状匹配、再到仿射变换与动态ROI跟随的完整工具链。本节的核心思路是:先用匹配算法在图像中定位产品,得到一个位姿(Pose),再把这个位姿传递给ROI和检测算子,让ROI“跟着产品走”。这样,无论产品怎么动,检测区域始终锁定在产品上的同一物理位置。
4.1 匹配方式的选择:模板匹配 vs 形状匹配
HALCON中常用的定位算子有两类。第一类是基于灰度的模板匹配,代表算子为create_template和best_match。它直接使用模板图像的灰度信息进行相关计算,适合纹理丰富、光照稳定的场景,但对光照变化和遮挡比较敏感。第二类是基于形状的匹配,代表算子为create_shape_model和find_shape_model。它提取模板的边缘轮廓,用梯度方向作为特征,对光照变化、部分遮挡和噪声有更强的容忍度,是工业检测中最常用的定位手段。
选择哪种方式,取决于产品特征。如果产品表面有稳定的字符、纹理或标记,灰度匹配可以做到亚像素精度;如果产品主要靠外形轮廓区分,或者光照条件波动较大,形状匹配更合适。对于本节讨论的位移、旋转、缩放问题,形状匹配天然支持角度和尺度的搜索范围设置,是更优先的选择。
4.2 形状模型的创建与参数设置
创建形状模型时,需要从一张“标准姿态”的图像中提取模板区域。假设我们检测一个金属冲压件,标准图像中产品中心位于图像坐标(320, 240),产品上有一个直径为8像素的圆孔需要检测。我们先用gen_rectangle1或gen_circle圈出包含产品轮廓的ROI,然后调用:
create_shape_model (ImageReduced, 'auto', -0.39, 0.39, 'auto', \
'auto', 'use_polarity', 'auto', 'auto', ModelID)
其中,-0.39到0.39弧度表示允许±22.5°的旋转搜索范围,'auto'让HALCON自动选择金字塔层数和对比度。如果产品可能缩放,还需要在find_shape_model中设置MinScale和MaxScale,例如0.9到1.1,表示允许±10%的尺度变化。
这里有一个关键点:搜索范围不是越大越好。角度范围每扩大一倍,匹配耗时大约增加一倍,同时误匹配的风险也会上升。合理的做法是先统计产线实际的最大偏移量,再留出20%~30%的余量。例如实测最大旋转为±15°,则设置±20°即可。
4.3 从匹配结果到仿射变换
find_shape_model返回的是一组匹配结果,每个结果包含行坐标、列坐标、角度和缩放因子。HALCON通常用Row、Column、Angle、Scale四个参数描述,也可以直接得到齐次变换矩阵。利用这个位姿,我们可以做两件事:
- 把标准ROI变换到当前图像位置:用
vector_angle_to_rigid或hom_mat2d_*系列算子构造仿射矩阵,再用affine_trans_region把预先定义好的检测ROI映射过去。 - 把图像反向变换到标准姿态:用
affine_trans_image把当前图像对齐到模板坐标系,之后所有检测都在标准坐标系下进行,ROI完全不用改。
两种方式各有优劣。前者保持原图不变,ROI动态跟随,适合需要保留原始图像信息的场景;后者把图像“摆正”,后续测量和检测逻辑最简单,但会引入插值误差,且图像尺寸可能变化。实际项目中,如果检测项是尺寸测量,建议用反向变换对齐图像;如果只是有无判断或缺陷检测,动态ROI跟随更轻量。
4.4 动态ROI跟随的实现
下面给出一个典型的动态ROI跟随流程。假设标准姿态下,我们已经在模板图像上定义了一个矩形检测区域ROI_Standard,它覆盖产品上的关键特征。每帧图像的处理逻辑如下:
find_shape_model (Image, ModelID, -0.35, 0.35, 0.9, 1.1, \
0.7, 1, 0.5, 'least_squares', 0, 0.9, \
Row, Column, Angle, Scale, Score)
if (|Score| > 0)
hom_mat2d_identity (HomMat2D)
hom_mat2d_scale (HomMat2D, Scale[0], Scale[0], 0, 0, HomMat2D)
hom_mat2d_rotate (HomMat2D, Angle[0], 0, 0, HomMat2D)
hom_mat2d_translate (HomMat2D, Row[0], Column[0], HomMat2D)
affine_trans_region (ROI_Standard, ROI_Current, HomMat2D, 'nearest_neighbor')
reduce_domain (Image, ROI_Current, ImageReduced)
* 后续检测算子作用于 ImageReduced
endif
这段代码中,Score是匹配得分,通常要求大于0.7才认为定位可信。如果得分过低,说明产品可能缺失、严重遮挡或姿态超出搜索范围,此时应触发报警而不是继续检测,否则后续测量结果不可信。
4.5 稳定性优化的关键细节
仅仅实现跟随还不够,实际产线上还需要注意以下几点:
- 模板质量:模板应包含产品上最稳定、最具区分度的轮廓,避免包含易变的光斑、反光或可拆卸部件。可以用
inspect_shape_model查看金字塔各层的轮廓质量。 - 搜索范围与耗时平衡:角度步长
AngleStep不宜过小,否则匹配时间急剧增加。一般先用'auto',再根据实际节拍微调。 - 多模板策略:如果同一工位混流生产多种型号,应为每种型号建立独立模型,或用
find_shape_models一次搜索多个模型,按得分最高者定位。 - ROI边界余量:动态ROI变换后,边缘可能因插值产生锯齿,建议在标准ROI基础上向外扩2~3像素,避免特征被裁掉。
- 坐标系一致性:HALCON图像坐标以左上角为原点,行向下、列向右。旋转正方向为逆时针。全文和代码中必须统一这个约定,否则角度符号容易出错。
find_shape_model只搜索平移,把角度范围设为0,这样速度最快。确认平移稳定后,再逐步放开角度和尺度范围。4.6 效果验证与判断依据
优化是否有效,不能只看单帧图像。建议采集连续200~500帧产线图像,记录每帧的匹配得分、定位偏差和最终检测结果。判断标准可以设为:匹配得分均值大于0.85,得分低于0.7的帧占比小于1%,动态ROI内特征完整率大于99%。如果得分波动大,优先检查光照稳定性和模板对比度;如果ROI跟随正确但检测仍误判,则问题可能出在后续检测算子的阈值上,而不是对齐环节。
上图展示了从标准模板到动态ROI跟随的完整数据流。左侧是标准姿态下定义的模板和ROI,中间通过形状模型建立匹配依据,右侧当前帧图像经过匹配得到位姿,再通过仿射变换把标准ROI映射到当前产品位置,最终在动态ROI内执行检测。底部的Score判断是安全闸门,确保只有定位可信时才继续检测。
总结来说,ROI与模板对齐的稳定性优化,本质上是把“检测区域”从图像坐标系解耦到产品坐标系。通过形状匹配获取位姿,通过仿射变换传递位姿,通过动态ROI锁定特征,再配合合理的搜索范围、模板质量和得分阈值,就能显著降低因产品位移、旋转、缩放造成的误检和漏检。实际落地时,建议先用小批量图像验证匹配重复性,再逐步放开角度和尺度范围,最后用产线连续数据统计漏检率和误检率,形成可量化的优化闭环。