( 转自)http://hi.baidu.com/yuzaihuan/blog/item/f9bc8feab78af2312cf534fe.html
对于透视变换,必须为map_matrix分配一个3 X 3数组。除了3 X 3矩阵和三个控点变为四个控点外,透视变换在其他方面与仿射变换完全类似。
#include "cv.h"
#include "highgui.h"
int _tmain(int argc, _TCHAR* argv[])
{
CvPoint2D32f srcQuad[4],dstQuad[4];
CvMat* warp_matrix=cvCreateMat(3,3,CV_32FC1);
IplImage *src,*dst;
if(argc==2 && ((src=cvLoadImage(argv[1],1))!=0))
{
dst=cvCloneImage(src);
dst->origin =src->origin ;
cvZero(dst);
srcQuad[0].x =0; //src top left
srcQuad[0].y=0;
srcQuad[1].x =src->width -1; //src top right
srcQuad[1].y=0;
srcQuad[2].x=0; //src bottom left
srcQuad[2].y=src->height -1;
srcQuad[3].x=src->width -1; //src bot right
srcQuad[3].y=src->height -1;
dstQuad[0].x=src->width *0.05; //dst top left
dstQuad[0].y=src->height *0.33;
dstQuad[1].x=src->width *0.9; //dst top right
dstQuad[1].y=src->height *0.25;
dstQuad[2].x=src->width *0.2; //dst bottom left
dstQuad[2].y=src->height *0.7;
dstQuad[3].x=src->width *0.8; //dst bot right
dstQuad[3].y=src->height *0.9;
cvGetPerspectiveTransform(srcQuad,dstQuad,warp_matrix);
cvWarpPerspective(src,dst,warp_matrix);
cvNamedWindow("Perspective_Warp",1);
cvShowImage("Perspective_Warp",dst);
cvWaitKey();
}
cvReleaseImage(&dst);
cvReleaseMat(&warp_matrix);
return 0;
}