opencv 图像翻转旋转.docx
- 文档编号:15737128
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:10
- 大小:17.32KB
opencv 图像翻转旋转.docx
《opencv 图像翻转旋转.docx》由会员分享,可在线阅读,更多相关《opencv 图像翻转旋转.docx(10页珍藏版)》请在冰点文库上搜索。
opencv图像翻转旋转
opencv图像翻转、旋转
转自:
1.图像左右翻转、翻转90度
opencv中并没有直接封装图像旋转任意角度的函数,一般我们可以使用仿射变换获得旋转后的图像,这时候可以进行任意角度的旋转,但是如果我们需要将图像旋转90度,例如只是对图像进行左右翻转,或者旋转90度将图像放倒,那么如果还使用仿射变换,显得有些不是很简单,有点过于复杂。
实际上可以使用求转置矩阵的方式将图像旋转90度,然后可以沿着指定的坐标轴对旋转后的图像进行翻转变化。
使用transpose(src,dst);对目标图像进行转置变换,可以将垂直的图像变为水平放置。
然后使用flip()函数对图像进行翻转。
整个过程非常简单,可以看下下面的代码就非常清晰的了解了。
//ImageFlip.cpp:
Definestheentrypointfortheconsoleapplication.
//#include"stdafx.h"
#include"opencv/cv.h"
#include"opencv/highgui.h"
#include"stdio.h"
#include"iostream"usingnamespacecv;
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:
//Blog:
#include<iostream>
#include<vector>
#include<opencv2/opencv.hpp>
intmain(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:
//Blog:
#include<iostream>
#include<vector>
#include<opencv2/opencv.hpp>intmain(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,double
scale,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]view
plain
copyprint?
#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);
else
length=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;//输出图像的宽度或高度
//为了保证无论如何旋转都能放下,输出图像的长和宽都设为输入图像对角线长度乘以SCALE
//但如果是缩小(SCALE<=1),这样会导致临时图像中放不下原图,所以对于所有缩小的情况,输出图像和临时图像的长宽都设为原图的对角线长度
if(SCALE<=1)
length=sqrt(src.cols*src.cols+src.rows*src.rows);
else
length=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;
}
效果图:
原图临时图像1结果1临时图像2结果2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- opencv 图像翻转旋转 图像 翻转 旋转