hom_mat2d_translate里也有Tx, Ty,那里的T是Translation(平移),表示"平移量";而P表示"一个点的位置"。
hom_mat2d_rotate的Px和Py参数,代表的是旋转中心(也称作固定点)的坐标。
理解这两个参数的关键在于 HALCON 特殊的坐标约定:
📌 参数名 vs. 实际含义
在 HALCON 计算仿射矩阵的算子中,参数命名和图像坐标的对应关系容易混淆:
Px(x坐标):对应图像的
Row(行坐标)Py(y坐标):对应图像的
Column(列坐标)
⚠️ 为什么是反的?
HALCON 官方文档解释,这是为了将图像变换统一到右手坐标系下,确保旋转方向在数学上是正确的。简而言之:
图像坐标系:原点在左上角,Row向下增长,Column向右增长。
数学坐标系(用于计算矩阵):X对应图像的Row,Y对应图像的Column。
💡 代码示例
结合你之前的代码片段:
area_center (RegionUnion1, Area, Row3, Column3) hom_mat2d_rotate (HomMat2DIdentity, rad(45), Row3, Column3, HomMat2DRotate)当你把Row3, Column3依次传给Px, Py时,实际上就是把区域的重心作为旋转的固定点。这样旋转后,区域会绕自己的重心原地转动,而不会在图像中发生位移。
📝 总结
| 参数 | 在 HALCON 中代表 | 对应图像概念 |
|---|---|---|
| Px | 旋转中心的 X 坐标 | 图像的行(Row) |
| Py | 旋转中心的 Y 坐标 | 图像的列(Column) |
一、先看两个坐标系长什么样
图像坐标系(你看到的)
(0,0) ─────────→ Column (列, x) │ │ │ ↓ Row (行, y)
原点在左上角
Row 向下增长
Column 向右增长
数学坐标系(矩阵计算用的)
↑ Y Column │ │ │ │ (0,0) ─────────→ X Row
原点在左下角(标准右手系)
X 向右增长
Y 向上增长
二、为什么 HALCON 要"X 对应 Row,Y 对应 Column"
HALCON 内部用数学坐标系算矩阵,但图像实际存储用图像坐标系。两者的轴对应关系是:
| 数学坐标 | 对应图像的 | 增长方向 |
|---|---|---|
| X | Row(行) | 图像里 Row 向下,数学里 X 向右 |
| Y | Column(列) | 图像里 Column 向右,数学里 Y 向上 |
关键点:这不是说 Row 就是水平方向,而是说在矩阵公式里,第一个坐标写 Row,第二个坐标写 Column。
三、用一个具体例子彻底搞懂
假设图像里有一个点:
Row = 100,Column = 200
在 HALCON 的仿射变换算子里:
hom_mat2d_rotate (HomMat2D, Angle, 100, 200, HomMat2DRotate) ↑ ↑ Px Py (Row) (Column)
Px = 100← 这是RowPy = 200← 这是Column
所以:
参数名
Px听起来像"水平坐标",但在图像里它其实是垂直方向的行号参数名
Py听起来像"垂直坐标",但在图像里它其实是水平方向的列号
四、为什么 HALCON 要这么设计
因为仿射变换矩阵的标准数学形式是:
[ x' ] [ cosθ -sinθ tx ] [ x ] [ y' ] = [ sinθ cosθ ty ] · [ y ] [ 1 ] [ 0 0 1 ] [ 1 ]
这个公式里的x和y是数学坐标。HALCON 为了直接套用这个公式,就把图像的Row当作数学的x,Column当作数学的y。
代价:参数名和直觉相反,容易混淆。
好处:旋转方向、矩阵乘法等数学运算不用做额外转换,直接套标准公式。
五、实际写代码时怎么记
记忆口诀
Px 是行,Py 是列;行往下,列往右。
写代码时的对应
area_center (Region, Area, Row, Column) * 正确写法:Row 传给 Px,Column 传给 Py hom_mat2d_rotate (HomMat2D, Angle, Row, Column, HomMat2DRotate)
常见错误
* 错误写法:把 Column 当 Px,Row 当 Py hom_mat2d_rotate (HomMat2D, Angle, Column, Row, HomMat2DRotate)
这样会导致旋转中心跑到错误的位置,区域旋转后飞偏。
六、和你之前代码的对应
area_center (RegionUnion1, Area, Row3, Column3) hom_mat2d_rotate (HomMat2DIdentity, rad(45), Row3, Column3, HomMat2DRotate) ↑ ↑ Px Py (Row) (Column)
Row3→Px(数学 X)Column3→Py(数学 Y)
这样旋转中心就是区域重心,区域原地转。
七、一句话总结
HALCON 的
Px对应图像的 Row,Py对应图像的 Column。参数名看起来"反直觉",是因为 HALCON 内部套用了标准数学坐标系公式。写代码时记住:第一个坐标传 Row,第二个坐标传 Column,就不会错。