拉伸、收縮、扭曲、旋轉是圖像的幾何變換,在三維視覺技術中大量應用到這些變換,又分爲仿射變換和透視變換。仿射變換一般用單應性建模,利用cvWarpAffine解決密集映射,用cvTransform解決稀疏映射。仿射變換能夠將矩形轉換成平行四邊形,它能夠將矩形的邊壓扁但必須保持邊是平行的,也能夠將矩形旋轉或者按比例變化。透視變換提供了更大的靈活性,一個透視變換能夠將矩陣轉變成梯形。固然,平行四邊形也是梯形,因此仿射變換是透視變換的子集。數組
本小節實現圖像的仿射變換。緩存
------------------------------------------------------------------------------------ 函數
如下是本例程用到的方法:ui
CloneImage
製做圖像的完整拷貝
IplImage* cvCloneImage( const IplImage* image );
image
原圖像.
函數 cvCloneImage 製做圖像的完整拷貝包括頭、ROI和數據
-----------------------------spa
GetAffineTransform.net
由三對點計算仿射變換 指針
CvMat* cvGetAffineTransform( const CvPoint2D32f* src,const CvPoint2D32f* dst, CvMat* map_matrix );code
src orm
輸入圖像的三角形頂點座標。 blog
dst
輸出圖像的相應的三角形頂點座標。
map_matrix
指向2×3輸出矩陣的指針。
函數cvGetAffineTransform計算知足如下關係的仿射變換矩陣:
這裏,dst(i)= (x'i,y'i),src(i)= (xi,yi),i = 0..2.
-----------------------------
WarpAffine
對圖像作仿射變換
void cvWarpAffine( const CvArr* src, CvArr* dst, constCvMat* map_matrix,
int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,
CvScalar fillval=cvScalarAll(0) );
src
輸入圖像.
dst
輸出圖像.
map_matrix
2×3 變換矩陣
flags
插值方法和如下開關選項的組合:
· CV_WARP_FILL_OUTLIERS - 填充全部輸出圖像的象素。若是部分象素落在輸入圖像的邊界外,那麼它們的值設定爲 fillval.
· CV_WARP_INVERSE_MAP - 指定 map_matrix是輸出圖像到輸入圖像的反變換,所以能夠直接用來作象素插值。不然, 函數從 map_matrix 獲得反變換。
fillval
用來填充邊界外面的值
函數 cvWarpAffine 利用下面指定的矩陣變換輸入圖像:
函數與 cvGetQuadrangleSubPix 相似,可是不徹底相同。cvWarpAffine 要求輸入和輸出圖像具備一樣的數據類型,有更大的資源開銷(所以對小圖像不太合適)並且輸出圖像的部分能夠保留不變。而 cvGetQuadrangleSubPix 能夠精確地從8位圖像中提取四邊形到浮點數緩存區中,具備比較小的系統開銷,並且老是所有改變輸出圖像的內容。要變換稀疏矩陣,使用 cxcore 中的函數 cvTransform 。
-----------------------------
2DRotationMatrix |
2DRotationMatrix |
------------------------------------------------------------------------------------
/*code*/