標籤:style blog http ar io color os sp for
2D仿射變換(AffineTransform)
主要函數:
//擷取變換矩陣M=[A B] warp_mat = getAffineTransform(srcTri, dstTri);
//擷取旋轉矩陣 rot_mat = getRotationMatrix2D(center, angle, scale);
重要函數:
warpAffine(src, warp_dst, warp_mat, warp_dst.size());
代碼如下,解釋全在注釋中:
1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 6 7 using namespace std; 8 using namespace cv; 9 10 void showImg(const string &win_name, const Mat &img)11 {12 namedWindow(win_name, CV_WINDOW_AUTOSIZE);13 imshow(win_name, img);14 }15 16 int main(void)17 {18 Point2f srcTri[3];19 Point2f dstTri[3];20 21 Mat rot_mat(2, 3, CV_32FC1);22 Mat warp_mat(2, 3, CV_32FC1);23 Mat src, warp_dst, rotate_dst;24 25 src = imread("lena.jpg");26 if (src.empty())27 return -1;28 showImg("src", src);29 30 warp_dst = Mat::zeros(src.rows, src.cols, src.type());31 32 //原始採樣點33 srcTri[0] = Point2f(0, 0);34 srcTri[1] = Point2f(src.cols - 1, 0);35 srcTri[2] = Point2f(0, src.rows - 1);36 37 //構建映射點38 dstTri[0] = Point2f(src.cols*0.0, src.rows*0.33);39 dstTri[1] = Point2f(src.cols*0.85, src.rows*0.25);40 dstTri[2] = Point2f(src.cols*0.15, src.rows*0.7);41 42 //擷取變換矩陣M=[A B]43 warp_mat = getAffineTransform(srcTri, dstTri);44 45 warpAffine(src, warp_dst, warp_mat, warp_dst.size());46 47 //旋轉中心48 Point center = Point(src.cols / 2, src.rows / 2);49 //旋轉角度50 double angle = -50.0;51 //旋轉中的縮放(因為方形映像如果不縮放進行旋轉會出現溢出現象),保證不溢出的話,縮放要在 二分之根號2 以下(約為0.7左右)52 double scale = 0.7;53 54 //擷取旋轉矩陣55 rot_mat = getRotationMatrix2D(center, angle, scale);56 57 warpAffine(src, rotate_dst, rot_mat, src.size());58 59 showImg("warp_dst", warp_dst);60 showImg("warp_rotate_dst", rotate_dst);61 waitKey();62 return 0;63 }
結果圖片:
仿射:
旋轉縮放:
主要說明請查閱相關數學資料。
以上。
OpenCV官方文檔學習記錄(20)