仿射变换与透视变换

转载自:https://www.jianshu.com/p/44cfa0be7c0e

仿射变换与透视变换

仿射变换

用途:

旋转、平移、缩放、反转

方法:

仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式。

\[\left[ \begin{matrix} x'\\y'\\1 \end{matrix} \right] = \left[ \begin{matrix} m_{11} & m_{12} & m_{13}\\ m_{21} & m_{22} & m_{23}\\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x\\y\\1 \end{matrix} \right]\\ \]

\[x' = m_{11}x + m_{12}y + m_{13}\\ y' = m_{21}x + m_{22}y + m_{23} \]

以上公式将点\((x,y)\)映射到\((x’,y’)\),在OpenCV中通过指定一个2x3矩阵实现此功能(公式中的m矩阵,是线性变换和平移的组合,\(m_{11},m_{12},m_{21},m_{22}\)为线性变化参数,\(m_{13},m_{23}\)为平移参数,其最后一行固定为0,0,1,因此,将3x3矩阵简化为2x3)

应用

在OpenCV中,仿射变换通过函数cvWrapAffine(src,dst,mat)实现。

其中mat是2x3的仿射矩阵,该矩阵可以利用函数cvGetAffineTransform(srcTri,dstTri,mat)得到,其中mat是被该函数填充的仿射矩阵,srcTri和dstTri分别是由三个顶点定义的平行四边形。

透视变换(投影变换)

用途

将2D矩阵图像变换成3D的空间显示效果,全景拼接。

方法

透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维\((x,y)\)到三维\((X,Y,Z)\),再到另一个二维\((x’,y’)\)空间的映射.相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域(不一定是平行四边形).它不止是线性变换.但也是通过矩阵乘法实现的,使用的是一个3x3的矩阵,矩阵的前两行与仿射矩阵相同\((m_{11},m_{12},m_{13},m_{21},m_{22},m_{23})\),也实现了线性变换和平移,第三行用于实现透视变换.

\[\left[ \begin{matrix} x'\\y'\\1 \end{matrix} \right] = \left[ \begin{matrix} m_{11} & m_{12} & m_{13}\\ m_{21} & m_{22} & m_{23}\\ m_{31} & m_{32} & m_{33} \end{matrix} \right] \left[ \begin{matrix} x\\y\\1 \end{matrix} \right]\\ \]

\[X = m_{11}x + m_{12}y + m_{13}\\ Y = m_{21}x + m_{22}y + m_{23}\\ Z = m_{31}x + m_{32}y + m_{33} \]

\[x' = \frac{X}{Z} = \frac{m_{11}x + m_{12}y + m_{13}}{m_{31}x + m_{32}y + m_{33}}\\ y' = \frac{Y}{Z} = \frac{m_{21}x + m_{22}y + m_{23}}{m_{31}x + m_{32}y + m_{33}} \]

以上公式设变换之前的点是\(z\)值为1的点,它三维平面上的值是\((x,y,1)\),在二维平面上的投影是\((x,y)\),通过矩阵变换成三维中的点\((X,Y,Z)\),再通过除以三维中Z轴的值,转换成二维中的点\((x’,y’)\)。从以上公式可知,仿射变换是透视变换的一种特殊情况.它把二维转到三维,变换后,再转映射回之前的二维空间(而不是另一个二维空间).

应用

在OpenCV中,透视变换通过函数cvWrapPerspective(src,dst,mat)实现。

透视矩阵是一个3x3的矩阵,在计算矩阵时,可利用函数cvGetPerspectiveTransform(srcQuad,dstQuad,mat)

posted @ 2020-09-11 20:24  码我疯狂的码  阅读(473)  评论(0编辑  收藏  举报