转载于:andylan_zy
一般角度旋转,我们会这样做:
先用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();
结果(左边原图,右图结果图):
可以看到,左右有多余的黑边,而且上边的一些字也没有了
分析可能是旋转后和原图长宽不一致造成的,于是改代码,将结果图片长宽对换:
-
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,Size(src.rows,src.cols));
-
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) ; //镜像
测试代码:
-
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()也可以实现,稍微麻烦了一点
总结一下:
需顺时针90°旋转时,transpose(src,tmp) + flip(tmp,dst,1)
需逆时针90°旋转时,transpose(src,tmp) + flip(tmp,dst,0)
需180°旋转时,直接flip(src,dst,-1)
工作中,flip()最后一个参数总是忘记该用哪一个,也常常有朋友问到旋转90°/-90° 的问题,
因此特写此文,方便自己,亦方便他人
如有转载,请标明出处