Halcon 仿射变换基础

仿射变换 Affine Transformation

仿射变换:由一个平面/立体图形变换到另一个平面/立体图形的一种变换。在改变的过程中,保持直线和平行线不变(平行线映射为平行线),任何放射变换都可以分解为缩放旋转平移切变的组合。

仿射变换矩阵:

\[\begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} a & b & c \\ d & e & f \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \]

  • 指定变换矩阵的参数(a,b,c,d,e,f)
  • 使用一个简单的输入点(x,y) = (2,3)在齐次坐标中表示为(2,3,1)
  • 计算得到输出点(x',y') = (a*2+b*3+c,d*2+e*3+f)

1.平移(Translation)

标准定义:平移由平移向量(Tx,Ty)定义,矩阵为:

\[\begin{bmatrix} 1 & 0 & Tx \\ 0 & 1 & Ty \\ 0 & 0 & 1 \end{bmatrix} \]

  • 示例:取平移向量(Tx,Ty) = (4,5)
  • 变换矩阵:

\[\begin{bmatrix} 1 & 0 & 4 \\ 0 & 1 & 5 \\ 0 & 0 & 1 \end{bmatrix} \]

  • 计算过程:

    \[\begin{bmatrix} 1 & 0 & 4 \\ 0 & 1 & 5 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 2 \\ 3 \\ 1 \end{bmatrix} = \begin{bmatrix} 6 \\ 8 \\ 1 \end{bmatrix} \]

  • 结果:点(2,3)变换到点(6,8)
  • 解释:点沿 x 轴移动 4 单位,沿 y 轴移动 5 单位。

Halcons算子:hom_mat2d_translate在现有变换矩阵基础上添加平移分量。

  • 参数:
  • HomMat2D:输入变换矩阵(若从零开始,需先初始化单位矩阵)
  • Tx, Ty:X/Y方向的平移量
  • HomMat2DTranslate:输出变换矩阵
* 初始化单位矩阵
hom_mat2d_identity(HomMat2DIdentity)
* 添加平移 (Tx=100, Ty=50)
hom_mat2d_translate(HomMat2DIdentity, 100, 50, HomMat2DTranslate)

2.缩放(Scaling)

标准定义:缩放由缩放因子Sx(x方向)Sy(y方向)定义,矩阵为:

\[\begin{bmatrix} Sx & 0 & 0 \\ 0 & Sy & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

  • 示例:取缩放因子Sx=2Sy=3
  • 变换矩阵:

\[\begin{bmatrix} 2 & 0 & 0 \\ 0 & 3 & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

  • 计算过程:

    \[\begin{bmatrix} 2 & 0 & 0 \\ 0 & 3 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 2 \\ 3 \\ 1 \end{bmatrix} = \begin{bmatrix} 4 \\ 9 \\ 1 \end{bmatrix} \]

    • 结果:点(2,3)变换到点(4,9)
    • 解释:点沿 x 轴缩放 2 倍,沿 y 轴缩放 3 倍。

Halcons算子:hom_mat2d_scale以指定中心点缩放。

  • 参数:
  • HomMat2D:输入变换矩阵(若从零开始,需先初始化单位矩阵)
  • Sx, Sy:X/Y方向的缩放因子
  • Px, Py:缩放中心坐标(图像坐标系)
  • HomMat2DScale:输出变换矩阵
* 初始化单位矩阵
hom_mat2d_identity(HomMat2DIdentity)
* 以点 (Px=300, Py=300) 为中心,X方向放大2倍,Y方向缩小0.5倍
hom_mat2d_scale(HomMat2DIdentity, 2, 0.5, 300, 300, HomMat2DScale)

3.旋转(Rotation)

标准定义:旋转由旋转角度θ(逆时针为正)定义,矩阵为:

\[\begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 \\ \sin(\theta) & \cos(\theta) & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

  • 示例:取旋转角度θ=90°(π/2弧度),则sin 90° = 1, cos 90° = 0
  • 变换矩阵:

\[\begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

  • 计算过程:

    \[\begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 2 \\ 3 \\ 1 \end{bmatrix} = \begin{bmatrix} -3 \\ 2 \\ 1 \end{bmatrix} \]

  • 结果:点(2,3)变换到点(-3,2)

  • 解释:点沿 x 轴旋转 90°,即逆时针旋转 90°。

Halcons算子:hom_mat2d_rotate绕指定中心点旋转。

  • 参数:
  • HomMat2D:输入变换矩阵(若从零开始,需先初始化单位矩阵)
  • Angle: 旋转角度(弧度制)
  • Px, Py:旋转中心坐标(图像坐标系)
  • HomMat2DRotate:输出变换矩阵
* 初始化单位矩阵
hom_mat2d_identity(HomMat2DIdentity)
* 绕点 (Px=200, Py=200) 旋转 30°(弧度 ≈0.5236)
AngleRad := 30 * 3.1415926 / 180
hom_mat2d_rotate(HomMat2DIdentity, AngleRad, 200, 200, HomMat2DRotate)

4.错切(Shearing)

标准定义:错切由错切系数Sx(x方向)Sy(y方向)定义,矩阵为:

\[\begin{bmatrix} 1 & Sx & 0 \\ Sy & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

  • 示例:取错切系数Sx=0.5Sy=0.2
  • 变换矩阵:

\[\begin{bmatrix} 1 & 0.5 & 0 \\ 0.2 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

  • 计算过程:

    \[\begin{bmatrix} 1 & 0.5 & 0 \\ 0.2 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 2 \\ 3 \\ 1 \end{bmatrix} = \begin{bmatrix} 1.5 \\ 2.6 \\ 1 \end{bmatrix} \]

    • 结果:点(2,3)变换到点(1.5,2.6)
    • 解释:点沿 x 轴错切 0.5 单位,沿 y 轴错切 0.2 单位。
  • 注意:错切矩阵的逆矩阵是:

\[\begin{bmatrix} 1 & -0.5 & 0 \\ -0.2 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

5.复合变换(Composition)

多个仿射变换可以组合成一个复合变换,矩阵的乘积表示。

  • 示例:先平移再缩放再旋转,平移向量(Tx,Ty)=(4,5),缩放因子Sx=2Sy=3,旋转角度θ=90°(π/2弧度)

  • 变换矩阵:

    \[\begin{bmatrix} 2 & 0 & 0 \\ 0 & 3 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 4 \\ 0 & 1 & 5 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

  • 合并后的复合变换矩阵:

\[ \begin{bmatrix} 0 & -2 & 8 \\ 3 & 0 & 15 \\ 0 & 0 & 1 \end{bmatrix} \]

  • 计算过程:

    \[\begin{bmatrix} 0 & -2 & 8 \\ 3 & 0 & 15 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 2 \\ 3 \\ 1 \end{bmatrix} = \begin{bmatrix} -1 \\ 6 \\ 1 \end{bmatrix} \]

    • 结果:点(2,3)变换到点(-1,6)
posted @ 2025-09-03 14:03  一楼二栋  阅读(33)  评论(0)    收藏  举报