DSP

图像的仿射变换与透视变换研究

2019-07-13 12:37发布

                                                                   上面三幅图分别为标志图形、道路标线、QR码的校正前后图,校正采用的是透视变换矩阵。 下面就主要研究一下透视变换。 1. 概念 透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。 上面是百度百科上关于透视变换的定义。(看了一遍没看懂) 讲到透视变换通常也会听到仿射变换,其实仿射变换和透视变换是一回事,不同之处在于仿射变换是二维坐标变换,透视变换是三维坐标变换。 仿射变换:                                                                   透视变换:                                                   其中,(u,v)为变换前的坐标,(x‘,y')为变换后的坐标; 由上述公式可知,仿射变换有6个未知数,透视变换有8个未知数,因此仿射变换矩阵的求解只需3组映射点(三点确定一个平面),透视变换矩阵的求解只需4组点(四点确定一个三维空间)。 2. 透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面, 其通用变换公式为:                                                      透视变换矩阵元素的含义:                                                    3. opencv函数形式 仿射变换函数: void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar()) 仿射变换矩阵生成函数: Mat getAffineTransform(const Point2f* src, const Point2f* dst) //@param: const Point2f* src:原图的三个固定顶点 //@param: const Point2f* dst:目标图像的三个固定顶点 //@return:仿射变换矩阵,可直接用于warpAffine()函数 //顶点数组长度超过3个,则会自动以前3个为变换顶点; 透视变换函数: void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar()) Mat getPerspectiveTransform(const Point2f* src, const Point2f* dst) //@param: src,dst原始点和目标点,个数>=4 //@:透视变换顶点为4个。 参考文章: 1.  https://mp.weixin.qq.com/s/b10zBadlvrSCeXVnrYHwHQ 2.  https://blog.csdn.net/yong_qi2015/article/details/80108276 3.  https://www.cnblogs.com/liekkas0626/p/5262942.html 4.  https://blog.csdn.net/hitwengqi/article/details/6890220  5.  http://m.elecfans.com/article/593459.html