标签: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 }
结果图片:
仿射:
旋转缩放:
主要说明请查阅相关数学资料。
以上。
标签:style blog http ar io color os sp for
原文地址:http://www.cnblogs.com/lhyz/p/4172306.html