上面三幅图分别为标志图形、道路标线、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