第六章 - 圖像變換 - 圖像拉伸、收縮、扭曲、旋轉[1] - 仿射變換(cvWarpAffine)

拉伸、收縮、扭曲、旋轉是圖像的幾何變換,在三維視覺技術中大量應用到這些變換,又分爲仿射變換和透視變換。仿射變換一般用單應性建模,利用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 利用下面指定的矩陣變換輸入圖像:

  • 若是沒有指定 CV_WARP_INVERSE_MAP ,
  • 不然, 

函數與 cvGetQuadrangleSubPix 相似,可是不徹底相同。cvWarpAffine 要求輸入和輸出圖像具備一樣的數據類型,有更大的資源開銷(所以對小圖像不太合適)並且輸出圖像的部分能夠保留不變。而 cvGetQuadrangleSubPix 能夠精確地從8位圖像中提取四邊形到浮點數緩存區中,具備比較小的系統開銷,並且老是所有改變輸出圖像的內容。要變換稀疏矩陣,使用 cxcore 中的函數 cvTransform 。

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

2DRotationMatrix

2DRotationMatrix
計算二維旋轉的仿射變換矩陣

CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle,
double scale, CvMat* map_matrix );
center
輸入圖像的旋轉中心座標
angle
旋轉角度(度)。正值表示逆時針旋轉(座標原點假設在左上角).
scale
各項同性的尺度因子
map_matrix
輸出 2×3 矩陣的指針
函數 cv2DRotationMatrix 計算矩陣:

[ α β | (1-α)*center.x - β*center.y ]
[ -β α | β*center.x + (1-α)*center.y ]

where α=scale*cos(angle), β=scale*sin(angle)
該變換並不改變原始旋轉中心點的座標,若是這不是操做目的,則能夠經過調整平移量改變其座標(譯者注:經過簡單的推導可知,仿射變換的實現是首先將旋轉中心置爲座標原點,再進行旋轉和尺度變換,最後從新將座標原點設定爲輸入圖像的左上角,這裏的平移量是center.x, center.y).

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

/*code*/

 

    1. #include <highgui.h>   
    2. #include <cv.h>   
    3.   
    4. int main(int argc, char** argv)  
    5. {  
    6.     CvPoint2D32f srcTri[3], dstTri[3]; //二維座標下的點,類型爲浮點   
    7.     CvMat* rot_mat = cvCreateMat( 2, 3, CV_32FC1 );  //多通道矩陣   
    8.     CvMat* warp_mat = cvCreateMat( 2, 3, CV_32FC1 );  
    9.     IplImage *src, *dst;  
    10.   
    11.     if( argc == 2 && ( ( src = cvLoadImage( argv[1], 1 ) ) != 0 ) )  
    12.     {  
    13.         dst = cvCloneImage( src );  //製做圖像的完整拷貝   
    14.         dst ->origin = src ->origin;    
    15.         /* 
    16.         int origin; /* 0 - 頂—左結構, 
    17.         1 - 底—左結構 (Windows bitmaps 風格)  
    18.         */  
    19.         cvZero( dst );  //清空數組   
    20.   
    21.         //計算矩陣仿射變換   
    22.         srcTri[0].x = 0;  
    23.         srcTri[0].y = 0;  
    24.         srcTri[1].x = src -> width - 1;  //縮小一個像素   
    25.         srcTri[1].y = 0;  
    26.         srcTri[2].x = 0;  
    27.         srcTri[2].y = src -> height - 1;  
    28.   
    29.         //改變目標圖像大小   
    30.         dstTri[0].x = src -> width * 0.0;  
    31.         dstTri[0].y = src -> height * 0.33;  
    32.         dstTri[1].x = src -> width * 0.85;  
    33.         dstTri[1].y = src -> height * 0.25;  
    34.         dstTri[2].x = src -> width * 0.15;  
    35.         dstTri[2].y = src -> height * 0.7;  
    36.         cvGetAffineTransform( srcTri, dstTri, warp_mat );  //由三對點計算仿射變換    
    37.         cvWarpAffine( src, dst, warp_mat );  //對圖像作仿射變換   
    38.         cvCopy( dst, src );  //將dst拷貝給src   
    39.   
    40.         //計算旋轉仿射變換   
    41.         CvPoint2D32f center = cvPoint2D32f( src -> width / 2, src -> height / 2 );  
    42.         double angle = -50.0; //旋轉角度,負值表示順時針   
    43.         double scale = 0.6;  //各項同性的尺度因子    
    44.         cv2DRotationMatrix( center, angle, scale, rot_mat );  
    45.         cvWarpAffine( src, dst, rot_mat );  //將src仿射變換存入dst   
    46.   
    47.         //輸出   
    48.         cvNamedWindow( "Affine_Transform", 1 );  
    49.         cvShowImage( "Affine_Transform", dst );  //最終是輸出dst    
    50.         cvWaitKey();  
    51.     }  
    52.     cvReleaseImage( &dst );  
    53.     cvReleaseMat( &rot_mat );  
    54.     cvReleaseMat( &warp_mat );  
    55.   
    56.     return 0;  
    57. }  
相關文章
相關標籤/搜索