opencv之透視變換cvWarpPerspective

本文部分內容轉自http://blog.csdn.net/augusdi/article/details/9022197


透視變換(單應性?)能提供更大的靈活性,但是一個透視投影並不是線性變換,因此所採用的映射矩陣是3*3,且控點變爲4個,其他方面與仿射變換完全類似,下面的例程是針對密集變換,稀疏圖像變換則採用cvPerspectiveTransform函數來處理。

------------------------------------------------------------------------------------------------

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

由四對點計算透射變換

CvMat* cvGetPerspectiveTransform( const CvPoint2D32f*src, const CvPoint2D32f* dst,

                                  CvMat*map_matrix );

 

#define cvWarpPerspectiveQMatrixcvGetPerspectiveTransform

src

輸入圖像的四邊形頂點座標。

dst

輸出圖像的相應的四邊形頂點座標。

map_matrix

指向3×3輸出矩陣的指針。

函數cvGetPerspectiveTransform計算滿足以下關係的透射變換矩陣:


這裏,dst(i)= (x'i,y'i),src(i)= (xi,yi),i = 0..3.


code:

#include<cv.h>
#include<highgui.h>


int main()
{
	CvPoint2D32f srcTri[4], dstTri[4];
	CvMat*       warp_mat = cvCreateMat (3, 3, CV_32FC1);
	IplImage*    src = NULL;
	IplImage*    dst = NULL;

	src = cvLoadImage ("F:\\bb1.jpg", 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;
}


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