转载地址:https://blog.csdn.net/andylanzhiyong/article/details/84857915
一般角度旋转,我们会这样做:
先用getRotationMatrix2D()来计算二维旋转变换矩阵,
再用warpAffine()来进行仿射变换
对于需90°或-90°旋转,如果我们也这样做:
Mat src = imread("E:/TestImg/t1.jpg");
Mat dst;
Point center(src.cols/2,src.rows/2); //旋转中心
double angle = -90.0; //角度
double scale = 1.0; //缩放系数
Mat rotMat = getRotationMatrix2D(center,angle,scale);
warpAffine(src,dst,rotMat,src.size());
imshow("src",src);
imshow("dst",dst);
waitKey();
上面这个只适用于长宽一样的图片
偶然间看到大佬博客:https://blog.csdn.net/fengbingchun/article/details/52554711
用到2个函数:
transpose(Mat src,Mat &dst); //转置
flip(Mat src,Mat &dst,int nFlag) ; //镜像
1、测试代码:
Mat src = imread("E:/TestImg/t1.jpg");
Mat temp,dst0,dst1,dst_1;
transpose(src, temp);
flip(temp,dst1,1);
flip(temp,dst0,0);
flip(temp, dst_1, -1);
imshow("src",src);
imshow("transpose",temp);
imshow("flip:1",dst1);
imshow("flip:0", dst0);
imshow("flip:-1", dst_1);
waitKey();
运行截图:
观测结果可以发现:
transpose()之后,图片做了90°转置,并且左右镜像了
再flip(),第3个参数为0时,图像摆正,相当于逆时针旋转了90°
2.当图像需要旋转90°时,flip()第3个参数为1:
Mat src = imread("E:/TestImg/t1.jpg");
Mat temp,dst;
transpose(src, temp);
flip(temp,dst,1);
imshow("src",src);
imshow("transpose",temp);
imshow("flip:1",dst);
waitKey();
3.当图像需要180°旋转时:
Mat src = imread("E:/TestImg/t1.jpg");
Mat temp,dst;
flip(src,dst,-1);
imshow("src",src);
imshow("flip: -1",dst);
当然,180°旋转用remap()也可以实现,稍微麻烦了一点
总结一下:
1、需顺时针90°旋转时,transpose(src,tmp) + flip(tmp,dst,1)
2、需逆时针90°旋转时,transpose(src,tmp) + flip(tmp,dst,0)
3、需180°旋转时,直接flip(src,dst,-1)