仿射变换与透视变换
转载自:https://www.jianshu.com/p/44cfa0be7c0e
仿射变换与透视变换
仿射变换
用途:
旋转、平移、缩放、反转
方法:
仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式。
以上公式将点\((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分别是由三个顶点定义的平行四边形。
![](https://img2020.cnblogs.com/blog/2097416/202009/2097416-20200911202227343-1043482814.png)
透视变换(投影变换)
用途
将2D矩阵图像变换成3D的空间显示效果,全景拼接。
方法
透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维\((x,y)\)到三维\((X,Y,Z)\),再到另一个二维\((x’,y’)\)空间的映射.相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域(不一定是平行四边形).它不止是线性变换.但也是通过矩阵乘法实现的,使用的是一个3x3的矩阵,矩阵的前两行与仿射矩阵相同\((m_{11},m_{12},m_{13},m_{21},m_{22},m_{23})\),也实现了线性变换和平移,第三行用于实现透视变换.
以上公式设变换之前的点是\(z\)值为1的点,它三维平面上的值是\((x,y,1)\),在二维平面上的投影是\((x,y)\),通过矩阵变换成三维中的点\((X,Y,Z)\),再通过除以三维中Z轴的值,转换成二维中的点\((x’,y’)\)。从以上公式可知,仿射变换是透视变换的一种特殊情况.它把二维转到三维,变换后,再转映射回之前的二维空间(而不是另一个二维空间).
应用
在OpenCV中,透视变换通过函数cvWrapPerspective(src,dst,mat)实现。
透视矩阵是一个3x3的矩阵,在计算矩阵时,可利用函数cvGetPerspectiveTransform(srcQuad,dstQuad,mat)
![](https://img2020.cnblogs.com/blog/2097416/202009/2097416-20200911202226904-2075207981.png)