opencv图片旋转90°/-90°/180°

一般角度旋转,我们会这样做:

先用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();

结果(左边原图,右图结果图):

opencv图片旋转90°/-90°/180°_第1张图片

可以看到,左右有多余的黑边,而且上边的一些字也没有了

分析可能是旋转后和原图长宽不一致造成的,于是改代码,将结果图片长宽对换:

    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();

结果:

opencv图片旋转90°/-90°/180°_第2张图片

还是一些字旋转后没有了还有大黑边,真是“叔能忍,婶不能忍”,遍寻网络终不得法.....

 

偶然间看到大佬博客: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();

运行截图:

opencv图片旋转90°/-90°/180°_第3张图片

观测结果可以发现:

 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();

结果:

opencv图片旋转90°/-90°/180°_第4张图片

 

3.当图像需要180°旋转时:

    Mat src = imread("E:/TestImg/t1.jpg");
	Mat temp,dst;
	flip(src,dst,-1);
	imshow("src",src);
	imshow("flip: -1",dst);

结果:

opencv图片旋转90°/-90°/180°_第5张图片

当然,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° 的问题,

因此特写此文,方便自己,亦方便他人

如有转载,请标明出处

 

 

 

 

 

你可能感兴趣的:(图像处理)