Opencv學習筆記——透視變換

透視變換與仿射變換有些類似,但相比而言有以下不同:

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;
}
實現結果如下:





發佈了45 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章