1. 程式人生 > >用仿射變換實現圖片的角度任意旋轉

用仿射變換實現圖片的角度任意旋轉

Mat src,rotate_dst;
char* source_window = "Source image";
char* rotate_window = "Rotate";
 int main( int argc, char** argv )
 {
   Point2f srcTri[3];
   Point2f dstTri[3];
   //定義一個2行3列的矩陣
Mat rot_mat( 2, 3, CV_32FC1 );
     /// 載入源影象
   src = imread( argv[1], 1 );
 /// 設定目標影象的大小和型別與源影象一致
  rotate_dst = Mat::zeros( src.rows, src.cols, src.type() );

   /// 設定源影象和目標影象上的三組點以計算仿射變換
   srcTri[0] = Point2f( 0,0 );
   srcTri[1] = Point2f( src.cols - 1, 0 );
   srcTri[2] = Point2f( 0, src.rows - 1 );

   dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );
   dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );
   dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );

   /// 求得仿射變換
   rot_mat = getAffineTransform( srcTri, dstTri );

   /// 對源影象應用上面求得的仿射變換
   warpAffine( src, rotate_dst, rot_mat, rotate_dst.size() );
   
   double scale = 0.6;
   double angle = 80;

   /// 計算繞影象中點順時針旋轉80度縮放因子為0.6的旋轉矩陣
 
   Point center = Point( rotate_dst.cols/2, rotate_dst.rows/2 );
   /// 通過上面的旋轉細節資訊求得旋轉矩陣
   rot_mat = getRotationMatrix2D( center, angle, scale );
   warpAffine( src, rotate_dst, rot_mat, rotate_dst.size() );
   /// 顯示結果
  imshow( source_window, src );
 imshow( rotate_window, rotate_dst );

   /// 等待使用者按任意按鍵退出程式
   //waitKey(0);

利用opencv實現仿射變換一般會涉及到warpAffine和getRotationMatrix2D兩個函式,其中warpAffine可以實現通過相應矩陣變換後的圖片,getRotationMatrix2D可以獲得旋轉矩陣,將矩陣應用於 warpAffine
warpAffine函式:
void cv::warpAffine
( InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar()
)
. src: 輸入影象
. dst: 輸出影象,尺寸由dsize指定,影象型別與原影象一致
. M: 2X3的變換矩陣
. dsize: 指定影象輸出尺寸
. flags: 插值演算法識別符號,有預設值INTER_LINEAR,