用仿射變換實現圖片的角度任意旋轉
阿新 • • 發佈:2018-12-23
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,