密集透视变换所用的函数与密集仿射变换类似,而且参数也相同。
WarpPerspective
对图像进行透视变换
void cvWarpPerspective( const CvArr* src, CvArr* dst, const CvMat* map_matrix, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) );
-
src
- 输入图像. dst
- 输出图像. map_matrix
- 3×3 变换矩阵 flags
-
插值方法和以下开关选项的组合:
- CV_WARP_FILL_OUTLIERS - 填充所有缩小图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
- CV_WARP_INVERSE_MAP - 指定 matrix 是输出图像到输入图像的反变换,因此可以直接用来做象素插值。否则, 函数从 map_matrix 得到反变换。
-
fillval
- 用来填充边界外面的值
函数 cvWarpPerspective 利用下面指定矩阵变换输入图像:
- 如果没有指定 CV_WARP_INVERSE_MAP , ,
- 否则,
要变换稀疏矩阵,使用 cxcore 中的函数 cvTransform 。
计算透视映射矩阵的函数:
GetPerspectiveTransform
由四边形的4个点计算透射变换
CvMat* cvGetPerspectiveTransform( const CvPoint2D32f* src, const CvPoint2D32f* dst, CvMat* map_matrix ); #define cvWarpPerspectiveQMatrix cvGetPerspectiveTransform
-
src
- 输入图像的四边形顶点坐标。 dst
- 输出图像的相应的四边形顶点坐标。 map_matrix
- 指向3×3输出矩阵的指针。
函数cvGetPerspectiveTransform计算满足以下关系的透射变换矩阵:
- 这里, dst(i) = (x'i,y'i),src(i) = (xi,yi),i = 0..3.
实现代码:
/*
透视变换
*/
#include"highgui.h"
#include"cv.h"
void doPerspective(IplImage* img)
{
CvPoint2D32f srcQuad[4], dstQuad[4];
CvMat* warp_matrix = cvCreateMat(3,3, CV_32FC1);
IplImage *dst;
dst = cvCloneImage(img);
dst->origin = img->origin;
cvZero(dst);
srcQuad[0].x = 0;
srcQuad[0].y = 0;
srcQuad[1].x = img->width -1;
srcQuad[1].y = 0;
srcQuad[2].x = 0;
srcQuad[2].y = img->height -1;
srcQuad[3].x = img->width -1;
srcQuad[3].y = img->height -1;
dstQuad[0].x = img->width*0.05;
dstQuad[0].y = img->height*0.33;
dstQuad[1].x = img->width*0.9;
dstQuad[1].y = img->height*0.25;
dstQuad[2].x = img->width*0.2;
dstQuad[2].y = img->height*0.7;
dstQuad[3].x = img->width*0.8;
dstQuad[3].y = img->height*0.9;
cvGetPerspectiveTransform(
srcQuad,
dstQuad,
warp_matrix
);
cvWarpPerspective(img, dst, warp_matrix);
cvNamedWindow("Perspective",1);
cvShowImage("Perspective",dst);
cvWaitKey(0);
cvReleaseImage(&dst);
cvReleaseMat(&warp_matrix);
}
结果