您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > opencv 图像翻转旋转
opencv图像翻转、旋转转自:图像左右翻转、翻转90度opencv中并没有直接封装图像旋转任意角度的函数,一般我们可以使用仿射变换获得旋转后的图像,这时候可以进行任意角度的旋转,但是如果我们需要将图像旋转90度,例如只是对图像进行左右翻转,或者旋转90度将图像放倒,那么如果还使用仿射变换,显得有些不是很简单,有点过于复杂。实际上可以使用求转置矩阵的方式将图像旋转90度,然后可以沿着指定的坐标轴对旋转后的图像进行翻转变化。使用transpose(src,dst);对目标图像进行转置变换,可以将垂直的图像变为水平放置。然后使用flip()函数对图像进行翻转。整个过程非常简单,可以看下下面的代码就非常清晰的了解了。//ImageFlip.cpp:Definestheentrypointfortheconsoleapplication.//#includestdafx.h#includeopencv/cv.h#includeopencv/highgui.h#includestdio.h#includeiostreamusingnamespacecv;usingnamespacestd;int_tmain(intargc,_TCHAR*argv[]){Matsrc=imread(lena.jpg);Matdst;transpose(src,dst);Matdst2;flip(dst,dst2,1);//flipbyyaxisMatdst3;flip(dst,dst3,0);//flipbyxaxisMatdst4;flip(dst,dst4,-1);//flipbybothaxisesimshow(src,src);imshow(dst,dst);imshow(dst2,dst2);imshow(dst3,dst3);imshow(dst4,dst4);cvWaitKey();return0;}实验结果:原始图像:转置以后:flip(dst,dst2,1);//flipbyyaxis2、任意角度旋转、同时缩放(输出图像大小与输入图像大小相同,容易造成图像不全)下面这份代码用于实现对图像的缩放与旋转。OpenCV版本:2.4.2//图像旋转与缩放//Author::(intargc,char**argv){cv::Matimage=cv::imread(../test.jpg);if(image.empty()){std::cout<<readimagefailure<<std::endl;return-1;}cv::Point2fcenter=cv::Point2f(image.cols/2,image.rows/2);//旋转中心doubleangle=30;//旋转角度doublescale=0.5;//缩放尺度cv::MatrotateMat;rotateMat=cv::getRotationMatrix2D(center,angle,scale);cv::MatrotateImg;cv::warpAffine(image,rotateImg,rotateMat,image.size());cv::imwrite(../rotate.jpg,rotateImg);return0;}//图像旋转与缩放//Author::(intargc,char**argv){cv::Matimage=cv::imread(../test.jpg);if(image.empty()){std::cout<<readimagefailure<<std::endl;return-1;}cv::Point2fcenter=cv::Point2f(image.cols/2,image.rows/2);//旋转中心doubleangle=30;//旋转角度doublescale=0.5;//缩放尺度cv::MatrotateMat;rotateMat=cv::getRotationMatrix2D(center,angle,scale);cv::MatrotateImg;cv::warpAffine(image,rotateImg,rotateMat,image.size());cv::imwrite(../rotate.jpg,rotateImg);return0;}原图:缩放:旋转:旋转+缩放3.图像旋转、缩放(缩放后图像完整的进行显示)旋转变换公式的推导:如下图,在2维坐标上,有一点p(x,y),直线op的长度为r,直线op和x轴的正向的夹角为a。直线op围绕原点做逆时针方向b度的旋转,到达p’(s,t)则有s=rcos(a+b)=rcos(a)cos(b)–rsin(a)sin(b)(1.1)t=rsin(a+b)=rsin(a)cos(b)+rcos(a)sin(b)(1.2)其中x=rcos(a),y=rsin(a)代入(1.1),(1.2),s=xcos(b)–ysin(b)(1.3)t=xsin(b)+ycos(b)(1.4)用行列式表示如下用到的一些OpenCV中的函数:(1)CvMat*cv2DRotationMatrix(CvPoint2D32fcenter,doubleangle,doublescale,CvMat*map_matrix);MatgetRotationMatrix2D(Point2fcenter,doubleangle,doublescale);说明:计算旋转加缩放的仿射矩阵参数:center:旋转中心angle:旋转度数,正值表示逆时针旋转。scale:各方向同性的缩放尺度map_matrix:输出参数,仿射变换矩阵,浮点型2*3矩阵返回值:仿射变换矩阵注意:默认的变换是以相反的顺序进行的,即从目标到源。对于目标图像中的任一点(x,y),先计算出它在源图像中的坐标,再将此点的像素值拷贝到目标图像中,所以计算出的变换矩阵是从目标到源的变换矩阵。例如逆时针旋转30度,不做缩放,计算出的变换矩阵为:(2)voidcvWarpAffine(constCvArr*src,CvArr*dst,constCvMat*map_matrix,intflags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,CvScalarfillval=cvScalarAll(0));voidwarpAffine(InputArraysrc,OutputArraydst,InputArrayM,Sizedsize,intflags=INTER_LINEAR,intborderMode=BORDER_CONSTANT,constScalar&borderValue=Scalar());说明:对图像做仿射变换参数:M:输入参数,2*3的仿射变换矩阵dsize:输出图像的尺寸flags:差值方法,若设置WARP_INVERSE_MAP标识,指明M是目的到源的变换。borderMode:边界处理方法注意:当设置标志位WARP_INVERSE_MAP时,目标图像的计算公式为:否则,先调用invertAffineTransform()计算出M的逆仿射变换M’,然后将M’带入以上公式进行变换。[cpp]viewplaincopyprint?#include<iostream>#include<opencv2/imgproc/imgproc.hpp>#include<opencv2/highgui/highgui.hpp>usingnamespacestd;usingnamespacecv;#defineSCALE0.5//缩放比例intmain(){Matsrc=imread(pic3.png);Matdst;//输出图像intangle=30;//旋转角度(正值表示逆时针旋转)intlength;//输出图像的宽度或高度//为了保证无论如何旋转都能放下,输出图像的长和宽都设为输入图像对角线长度乘以SCALE//但如果是缩小(SCALE<=1),这样会导致临时图像中放不下原图,所以对于所有缩小的情况,输出图像和临时图像的长宽都设为原图的对角线长度if(SCALE<=1)length=sqrt(src.cols*src.cols+src.rows*src.rows);elselength=sqrt(src.cols*src.cols+src.rows*src.rows)*SCALE;//建立临时图像,长宽都是源图像的对角线长度,将源图像复制到临时图像的中心后再变换MattempImg(length,length,src.type());//临时图像,大小和输出图像一样大intROI_x=length/2-src.cols/2;//ROI矩形左上角的x坐标intROI_y=length/2-src.rows/2;//ROI矩形左上角的y坐标RectROIRect(ROI_x,ROI_y,src.cols,src.rows);//ROI矩形MattempImgROI2(tempImg,ROIRect);//tempImg的中间部分src.copyTo(tempImgROI2);//将原图复制到tempImg的中心Point2fcenter(length/2,length/2);//旋转中心MatM=getRotationMatrix2D(center,angle,SCALE);//计算旋转的仿射变换矩阵//输出看看算出的矩阵是什么cout<<变换矩阵:<<endl;cout<<M.at<double>(0,0)<<,<<M.at<double>(0,1)<<,<<M.at<double>(0,2)<<,<<endl;cout<<M.at<double>(1,0)<<,<<M.at<double>(1,1)<<,<<M.at<double>(1,2)<<,<<endl;warpAffine(tempImg,dst,M,Size(length,length));//仿射变换//显示imshow(src,src);imshow(tempImg,tempImg);imshow(dst,dst);waitKey(0);return0;}#include<iostream>#include<opencv2/imgproc/imgproc.hpp>#include<opencv2/highgui/highgui.hpp>usingnamespacestd;usingnamespacecv;#defineSCALE0.5//缩放比例intmain(){Matsrc=imread(pic3.png);Matdst;//输出图像intangle=30;//旋转角度(正值表示逆时针旋转)intlength;//输出图像
本文标题:opencv 图像翻转旋转
链接地址:https://www.777doc.com/doc-4010221 .html