☰
hom_mat2d_rotate 的 Px 和 Py 参数
2026/10/18 7:29:00 网站建设 项目流程

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 内部用数学坐标系算矩阵,但图像实际存储用图像坐标系。两者的轴对应关系是:

数学坐标对应图像的增长方向
XRow(行)图像里 Row 向下,数学里 X 向右
YColumn(列)图像里 Column 向右,数学里 Y 向上

关键点:这不是说 Row 就是水平方向,而是说在矩阵公式里,第一个坐标写 Row,第二个坐标写 Column。


三、用一个具体例子彻底搞懂

假设图像里有一个点:

Row = 100,Column = 200

在 HALCON 的仿射变换算子里:

hom_mat2d_rotate (HomMat2D, Angle, 100, 200, HomMat2DRotate) ↑ ↑ Px Py (Row) (Column)
  • Px = 100← 这是Row

  • Py = 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,就不会错。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询