warpPerspective函数
主要作用:对图像进行透视变换,就是变形
函数的调用形式:
C++: void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
参数详解:
InputArray src:输入的图像
OutputArray dst:输出的图像
InputArray M:透视变换的矩阵
Size dsize:输出图像的大小
int flags=INTER_LINEAR:输出图像的插值方法,
combination of interpolation methods (INTER_LINEAR or INTER_NEAREST) and the optional flagWARP_INVERSE_MAP, that sets M as the inverse transformation ( )
int borderMode=BORDER_CONSTANT:图像边界的处理方式
const Scalar& borderValue=Scalar():边界的颜色设置,一般默认是0
函数原理:
透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。通用的变换公式为:
u,v是原始图片左边,对应得到变换后的图片坐标x,y,其中。
变换矩阵可以拆成4部分,
表示线性变换,比如scaling,shearing和ratotion。
用于平移,
产生透视变换。所以可以理解成仿射等是透视变换的特殊形式。经过透视变换之后的图片通常不是平行四边形(除非映射视平面和原来平面平行的情况)。
重写之前的变换公式可以得到:
所以,已知变换对应的几个点就可以求取变换公式。反之,特定的变换公式也能新的变换后的图片。简单的看一个正方形到四边形的变换:
变换的4组对应点可以表示成:
根据变换公式得到:
定义几个辅助变量:
都为0时变换平面与原来是平行的,可以得到:
不为0时,得到:
求解出的变换矩阵就可以将一个正方形变换到四边形。反之,四边形变换到正方形也是一样的。于是,我们通过两次变换:四边形变换到正方形+正方形变换到四边形就可以将任意一个四边形变换到另一个四边形。
- #include<cv.h>
- #include<highgui.h>
- #pragma comment(lib, "cv.lib")
- #pragma comment(lib, "cxcore.lib")
- #pragma comment(lib, "highgui.lib")
- int main()
- {
- CvPoint2D32f srcTri[4], dstTri[4];
- CvMat* warp_mat = cvCreateMat (3, 3, CV_32FC1);
- IplImage* src = NULL;
- IplImage* dst = NULL;
- src = cvLoadImage ("test.png", 1);
- dst = cvCloneImage (src);
- dst->origin = src->origin;
- cvZero (dst);
- srcTri[0].x = 0;
- srcTri[0].y = 0;
- srcTri[1].x = src->width - 1;
- srcTri[1].y = 0;
- srcTri[2].x = 0;
- srcTri[2].y = src->height - 1;
- srcTri[3].x = src->width - 1;
- srcTri[3].y = src->height - 1;
- dstTri[0].x = src->width * 0.05;
- dstTri[0].y = src->height * 0.33;
- dstTri[1].x = src->width * 0.9;
- dstTri[1].y = src->height * 0.25;
- dstTri[2].x = src->width * 0.2;
- dstTri[2].y = src->height * 0.7;
- dstTri[3].x = src->width * 0.8;
- dstTri[3].y = src->height * 0.9;
- cvGetPerspectiveTransform (srcTri, dstTri, warp_mat);
- cvWarpPerspective (src, dst, warp_mat);
- cvNamedWindow("src", 1);
- cvShowImage("src", src);
- cvNamedWindow ("Affine_Transform", 1);
- cvShowImage ("Affine_Transform", dst);
- cvWaitKey (0);
- cvReleaseImage (&src);
- cvReleaseImage (&dst);
- cvReleaseMat (&warp_mat);
- return 0;
- }