halcon核心-仿射变换 / 位置修正(六)

19 阅读7分钟

仿射变换 / 位置修正

VM / VPP 对照

VM / VPP 操作Halcon 算子链核心区别
拖"位置修正"工具 → 关联定位结果 → 所有检测 ROI 跟着跑vector_angle_to_rigid → affine_trans_region / affine_trans_imageVM 自动关联,Halcon 要手动把每个 ROI 都用变换矩阵转一遍

万能算子链

* 步骤1: 模板匹配
find_shape_model (Image, ModelID, rad(-30), rad(30), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
* 步骤2: 计算刚性变换矩阵
vector_angle_to_rigid (RowRef, ColRef, AngleRef, Row, Column, Angle, HomMat2D)
* 步骤3: 区域仿射变换
affine_trans_region (RegionRef, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
* 步骤4: 点坐标变换
affine_trans_point_2d (HomMat2D, RowRefPoint, ColRefPoint, RowTrans, ColTrans)

🔬 算子参数详解与原理

核心思路: 仿射变换/位置修正的本质是"先定位、再求变换、后映射"。通过模板匹配获取目标在当前图像中的实际位姿(位置+角度),与训练时的参考位姿对比计算出2D刚性变换矩阵(旋转+平移),再将所有预设的检测ROI和参考点通过该矩阵映射到当前图像的对应位置。这样即使来料有偏移或旋转,检测区域也能自动跟随目标,是所有多工位视觉检测项目的骨架技术。VM/VPP将定位结果与检测ROI的关联封装为"位置修正"工具,而Halcon需要手动对每个ROI应用变换矩阵。

算子VM / VPP 对应操作核心作用
find_shape_model模板匹配 → 搜索目标 → 输出位姿在图像中搜索与训练模板相似的目标,返回匹配位置的亚像素坐标和旋转角度
vector_angle_to_rigid位置修正 → 计算偏移量 → 生成变换矩阵根据参考位姿和当前位姿计算2D刚性变换矩阵(HomMat2D),包含旋转和平移
affine_trans_region位置修正 → ROI跟随 → 区域映射将参考区域(Region)按变换矩阵映射到当前图像位置,实现检测ROI的自动对齐
affine_trans_point_2d位置修正 → 坐标转换 → 输出实际坐标将参考点坐标按变换矩阵映射到当前图像坐标,常用于机械手抓取点转换

① find_shape_model — 模板匹配搜索

find_shape_model (Image, ModelID, rad(-30), rad(30), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)

参数说明:

  1. Image (输入): 输入的搜索图像。
  2. ModelID (输入): 训练好的形状模型句柄,由create_shape_model生成。
  3. rad(-30) (AngleStart): 角度搜索范围的起始值(弧度)。
  4. rad(30) (AngleExtent): 角度搜索范围的终止值(弧度)。搜索范围为[-30°, +30°]。角度范围越大,搜索时间越长。
  5. 0.5 (MinScore): 最小匹配分数阈值(0~1)。只有匹配分数≥0.5的目标才被接受。分数越高,误检率越低,但可能漏检轻微变形的目标。
  6. 1 (NumMatches): 最多返回的匹配数量。设为1表示只找最佳匹配;设为0表示返回所有满足条件的匹配。
  7. 0.5 (MaxOverlap): 最大重叠比例。多个匹配之间的重叠面积超过此比例时,只保留分数最高的一个。用于抑制相邻重复检测。
  8. 'least_squares' (SubPixel): 亚像素优化方法。可选:
  •   'none': 无亚像素优化,精度约1像素
  •   'least_squares': 最小二乘优化,精度约0.1像素
  •   'least_squares_high': 高精度最小二乘,精度约0.01像素
  •   'max_deformation': 允许形变的优化,适合柔性物体
  1. 0 (NumLevels): 金字塔层数。0表示使用模型创建时设定的层数;设为N则强制使用N层金字塔。层数越多搜索越快,但精度可能下降。
  2. 0.9 (Greediness): 贪婪度(0~1)。值越高搜索速度越快,但可能漏检;值越低搜索越彻底但越慢。通常0.7~0.9。
  3. Row, Column (输出): 匹配目标的中心坐标(亚像素精度)。
  4. Angle (输出): 匹配目标的旋转角度(弧度)。
  5. Score (输出): 匹配分数(0~1),表示匹配质量。

工作原理: 形状模板匹配基于边缘特征。训练阶段,create_shape_model提取模板的边缘点及其梯度方向,构建多分辨率金字塔模型。搜索阶段,find_shape_model在图像金字塔上由粗到精逐层匹配:先在低分辨率层快速定位候选区域,再在高分辨率层精细优化位姿。匹配时不仅比较边缘位置,还比较边缘方向的相似性,因此对光照变化、轻微遮挡、对比度变化具有较强鲁棒性。

工程经验: AngleStart/AngleExtent应尽量小(根据实际来料角度波动设定),以提升搜索速度;MinScore根据现场稳定性调整,一般0.5~0.8;若目标有缩放变化,应使用find_scaled_shape_model或find_aniso_shape_model。

② vector_angle_to_rigid — 计算刚性变换矩阵

vector_angle_to_rigid (RowRef, ColRef, AngleRef, Row, Column, Angle, HomMat2D)

参数说明:
• RowRef, ColRef (输入): 模板训练时的参考中心坐标(Row, Column)。
• AngleRef (输入): 模板训练时的参考角度(弧度)。
• Row, Column (输入): 当前图像中匹配到的目标中心坐标(来自find_shape_model的输出)。
• Angle (输入): 当前图像中匹配到的目标旋转角度(来自find_shape_model的输出)。
• HomMat2D (输出): 输出的2D齐次变换矩阵(3×3)。该矩阵包含从参考位姿到当前位姿的旋转和平移变换。

工作原理: 刚性变换(Rigid Transformation)只包含旋转和平移,不包含缩放和剪切。vector_angle_to_rigid根据两组对应点(参考点和当前点)和对应角度,计算出唯一的刚性变换矩阵。数学上,该矩阵为:
HomMat2D = [cos(Δθ) -sin(Δθ) Δx]
[sin(Δθ) cos(Δθ) Δy]
[0         0        1 ]
其中Δθ = Angle - AngleRef为旋转角度差,Δx和Δy为平移量。关键特性: 该变换保持物体的形状和大小不变,只改变位置和方向。所有参考坐标(Region、点、轮廓)乘以该矩阵即可得到当前图像中的对应坐标。注意: 如果物体存在缩放变化,应使用vector_to_similarity(相似变换,含缩放)或vector_to_hom_mat2d(一般仿射变换)。

③ affine_trans_region — 区域仿射变换

affine_trans_region (RegionRef, RegionAffineTrans, HomMat2D, 'nearest_neighbor')

参数说明:

  1. RegionRef (输入): 参考区域(Region),即训练时设定的检测ROI。
  2. RegionAffineTrans (输出): 变换后的区域,已映射到当前图像的对应位置。
  3. HomMat2D (输入): vector_angle_to_rigid生成的2D变换矩阵。
  4. 'nearest_neighbor' (Interpolate): 插值方式。可选:
  •   'nearest_neighbor': 最近邻插值,速度快但可能有锯齿
  •   'constant': 常数插值
  •   'bilinear': 双线性插值,边缘更平滑
    对于区域变换,通常使用'nearest_neighbor'即可。

工作原理: 对Region中的每个像素坐标(x, y),应用HomMat2D变换得到新坐标(x', y'),然后用指定的插值方式重建区域。由于Region使用游程编码存储,变换后需要重新计算游程,因此结果可能与原始区域有细微的像素级差异。

应用场景: 这是"位置修正"的核心算子——将训练时画好的检测ROI(如焊盘检测区、元件检测区)自动映射到当前来料的位置,确保后续检测(Blob分析、1D测量等)始终在正确的区域执行。

最佳实践: 对每个需要跟随定位的ROI都调用一次affine_trans_region;如果ROI数量多,可将所有ROI合并为一个Tuple批量变换。

④ affine_trans_point_2d — 点坐标变换

affine_trans_point_2d (HomMat2D, RowRefPoint, ColRefPoint, RowTrans, ColTrans)

参数说明:
• HomMat2D (输入): 2D变换矩阵。
• RowRefPoint, ColRefPoint (输入): 参考点坐标(可以是单个点或Tuple数组)。
• RowTrans, ColTrans (输出): 变换后的点坐标。

工作原理: 对输入点(x, y)应用齐次坐标变换:[x', y', 1]ᵀ = HomMat2D × [x, y, 1]ᵀ。由于HomMat2D是刚性变换矩阵,变换后的点保持了与参考点的相对几何关系,只是整体发生了旋转和平移。

应用场景:

  1. 机械手抓取:将训练时的参考抓取点变换到当前目标的实际位置,输出给机械手;
  2. 多点位检测:将多个检测点的参考坐标一次性变换到当前位置;
  3. 标记点跟踪:跟踪物体上特定标记点的运动轨迹。

与affine_trans_region的区别: affine_trans_point_2d只变换离散的点坐标,输出的是浮点坐标;affine_trans_region变换的是像素区域,输出的是Region对象。两者配合使用可实现完整的"定位+检测+输出"流程。