透視變換與仿射變換有些類似,但相比而言有以下不同:
1. 仿射需要三個定位點,而且第一個是原點出發,一直到原點對點。透視需要四個,第一個是原點,最後一個是原點對 點。
2. 仿射的矩陣是2*3的矩陣,透視的矩陣式3*3的矩陣
3. 仿射和透視實現的效果不同
具體代碼如下:
#include "stdio.h"
#include "highgui.h"
#include "cv.h"
int main(int argc, char* argv[])
{
CvPoint2D32f srcQuad[4],dstQuad[4],srcQuad1[3],dstQuad1[3];
CvMat *warp_matrix=cvCreateMat(3,3,CV_32FC1);//透視的變換矩陣,必須是3*3
CvMat *warp_mat=cvCreateMat(2,3,CV_32FC1);//仿射的變換矩陣,必須是2*3
IplImage *src,*dst,*dss;
src=cvLoadImage("Lena.png");
dst=cvCloneImage(src);
dst->origin=src->origin;
dss=cvCloneImage(src);
dss->origin=src->origin;
cvZero(dst);
cvZero(dss);
//透視變換的四個點的座標
srcQuad[0].x=0;
srcQuad[0].y=0;
srcQuad[1].x=src->width-1;
srcQuad[1].y=0;
srcQuad[2].x=0;
srcQuad[2].y=src->height-1;
srcQuad[3].x=src->width-1;
srcQuad[3].y=src->height-1;
dstQuad[0].x=src->width*0.05;
dstQuad[0].y=src->height*0.33;
dstQuad[1].x=src->width*0.9;
dstQuad[1].y=src->height*0.25;
dstQuad[2].x=src->width*0.2;
dstQuad[2].y=src->height*0.9;
dstQuad[3].x=src->width*0.8;
dstQuad[3].y=src->height*0.9;
//仿射變換四個點的座標
srcQuad1[0].x=0;
srcQuad1[0].y=0;
srcQuad1[1].x=src->width-1;
srcQuad1[1].y=0;
srcQuad1[2].x=src->width-1;
srcQuad1[2].y=src->height-1;
dstQuad1[0].x=src->width*0.05;
dstQuad1[0].y=src->height*0.33;
dstQuad1[1].x=src->width*0.9;
dstQuad1[1].y=src->height*0.25;
dstQuad1[2].x=src->width*0.85;
dstQuad1[2].y=src->height*0.9;
//透視的變換過程,與仿射的區別主要在要有四個定位點,而且變換矩陣不相同
cvGetPerspectiveTransform(srcQuad,dstQuad,warp_matrix);
cvWarpPerspective(src,dst,warp_matrix);
cvGetAffineTransform(srcQuad1,dstQuad1,warp_mat);
/*對圖像做仿射變換,獲取仿射變換的矩陣,這裏warp_mat便是從srcTri到dstTri的變換矩陣,在這過程中至少需要三個點,三個點定義了一個平行四邊形
這三個點可以是圖像四個頂點中任意三個,但要明確變形後的三個點的位置並能夠對應上*/
cvWarpAffine(src,dss,warp_mat);
cvNamedWindow("Perspective",1);
cvShowImage("Perspective",dst);
cvNamedWindow("FangShe",1);
cvShowImage("FangShe",dss);
cvWaitKey(0);
printf("Hello World!\n");
return 0;
}
實現結果如下: