Opencv 3仿射变换之缩放 平移 旋转 倾斜 反射 透视

来源:互联网 发布:python开发入门详解 编辑:程序博客网 时间:2024/06/07 22:17

仿射变换涉及大量的关于矩阵的运算,这里就不在过多讲解了,关于矩阵参考如下:

http://blog.csdn.net/myan/article/details/647511
https://www.zhihu.com/question/19919917/answer/270694029?utm_source=qq&utm_medium=social

仿射变换的概念:很通俗易懂

https://www.zhihu.com/question/20666664

//仿射变换 缩放 平移 旋转 倾斜 反射 透视

#include<iostream>#include<opencv2\opencv.hpp>using namespace std;using namespace cv;int main(void){Mat src = imread("C:/Users/11741/Desktop/image/high.jpg");    //原图if (!src.data)return -1;cout << "1.缩放" << endl;cout << "2.平移" << endl;cout << "3.旋转" << endl;cout << "4.倾斜" << endl;cout << "5.反射" << endl;cout << "6.透视" << endl;int num;while (1){cin >> num;switch (num){case 1:{Mat dst;resize(src, dst, Size(0, 0), 0.5, 0.5, 1);    //参数一:原图;参数二:目标图;如果参数三为0,则按参数四计算,参数四为缩放因子;参数三为缩放大小imshow("src", src);                 //显示原图imshow("dst", dst);                 //显示目标图waitKey(0);break;}case 2:{Mat dst;Mat M = (Mat_<double>(2, 3) << 1, 0, 200, 0, 1, 150);            //构建平移矩阵,表示x方向平移200,y方向平移150warpAffine(src, dst, M, src.size());                     //进行仿射变换,参数三为变换的矩阵,参数四:目标图大小imshow("src", src);imshow("dst", dst);waitKey(0);break;}case 3:{ Mat dst;Mat M = getRotationMatrix2D(Point2f(0,src.rows), 40, 1);       //获取变换矩阵,参数一:旋转中心;参数二:角度(逆时针);参数三:缩放因子warpAffine(src, dst, M, src.size());                                //进行仿射变换imshow("src", src);imshow("dst", dst);waitKey(0);break;}case 4:{Mat dst; Point2f srcTriangle[3];              //目标图和源图像设置三组点计算仿射变换Point2f dstTriangle[3];              srcTriangle[0] = Point2f(0, 0);srcTriangle[1] = Point2f(src.cols - 1, 0);srcTriangle[2] = Point2f(0, src.rows - 1);dstTriangle[0] = Point2f(0, src.rows*0.33);dstTriangle[1] = Point2f(src.cols*0.65, src.rows*0.35);dstTriangle[2] = Point2f(src.cols*0.15, src.rows*0.6);Mat M = getAffineTransform(srcTriangle, dstTriangle);          //获取变换矩阵warpAffine(src, dst, M, src.size());imshow("src", src);imshow("dst", dst);waitKey(0);break;}case 5:{Mat dst;Mat Mh = (Mat_<double>(2, 3) << -1, 0, src.cols, 0, 1, 0);     //水平Mat Mv = (Mat_<double>(2, 3) << 1, 0, 0, 0, -1, src.rows);      //垂直Mat M = (Mat_<double>(2, 3) << -1, 0, src.cols, 0, -1, src.rows);  //水平+垂直warpAffine(src, dst, Mh, src.size()); imshow("src", src);imshow("dst", dst);waitKey(0);break;}case 6:{Mat dst;Point2f srcMar[4];Point2f dstMar[4];                             //目标图与原图设置四组点srcMar[0] = Point(0, 0);srcMar[1] = Point(src.cols - 1, 0);srcMar[2] = Point(0, src.rows - 1);srcMar[3] = Point(src.cols - 1, src.rows - 1);dstMar[0] = Point(src.cols*0.4, src.rows*0.3);dstMar[1] = Point(src.cols*0.7,src.rows*0.1);dstMar[2] = Point(src.cols*0.1, src.rows*0.8);dstMar[3] = Point(src.cols*0.8, src.rows*0.9);Mat M = getPerspectiveTransform(srcMar, dstMar);         //获取透视矩阵warpPerspective(src, dst, M, src.size());imshow("src", src);imshow("dst", dst);waitKey(0);break;} default:return 0;break;}}waitKey(0);return 0;}


 
阅读全文
0 0
原创粉丝点击