‘壹’ 图片处理-opencv-3.图像缩放、旋转、翻转、平移
result = cv2.resize(src, dsize[, result[. fx[, fy[, interpolation]]]])
图像旋转主要调用getRotationMatrix2D()函数和warpAffine()函数实现
M = cv2.getRotationMatrix2D(旋转中心, 旋转度数, scale)
rotated = cv2.warpAffine(原始图像, 旋转参数, 原始图像宽高)
dst = cv2.flip(src, flipCode)
图像平移首先定义平移矩阵M,再调用warpAffine()函数实现平移
M = np.float32([[1, 0, x], [0, 1, y]])
shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
‘贰’ opencv 图像旋转的问题 ,图片大小不变,怎么把图片移到中间去,图片跟框框想切
#include"StdAfx.h"
#include"cv.h"
#include"highgui.h"
#include"math.h"
intmain()
{
IplImage*src=0;
IplImage*dst=0;
/**/
if((src=cvLoadImage("d:\Image\mini.png",-1))!=0)
{
intdelta=1;
intangle=0;
intopt=0;//1:旋转加缩放
//0: 仅仅旋转
doublefactor;
dst=cvCloneImage(src);
cvNamedWindow("src",1);
cvShowImage("src",src);
for(;;)
{
floatm[6];
//Matrixmlookslike:
//
//[m0 m1 m2]===> [A11 A12 b1]
//[m3 m4 m5] [A21 A22 b2]
//
CvMatM=cvMat(2,3,CV_32F,m);
intw=src->width;
inth=src->height;
if(opt)//旋转加缩放
factor=(cos(angle*CV_PI/180.)+1.0)*2;
else// 仅仅旋转
factor=1;
m[0]=(float)(factor*cos(-angle*2*CV_PI/180.));
m[1]=(float)(factor*sin(-angle*2*CV_PI/180.));
m[3]=-m[1];
m[4]=m[0];
//将旋转中心移至图像中间
m[2]=w*0.5f;
m[5]=h*0.5f;
// dst(x,y)=A*src(x,y)+b
cvZero(dst);
cvGetQuadrangleSubPix(src,dst,&M);
cvNamedWindow("dst",1);
cvShowImage("dst",dst);
if(cvWaitKey(1)==27)//ESC
break;
angle=(int)(angle+delta)%360;
}//for-loop
}
return0;
}
参考程序如上所述,如果原始图像大小不变是无法输出到原始图像的。
比如你原始图像为200*200,旋转45度,输出到一个200*200的大小的图像空间里,这个原始图片的大小已经是原来的一半成了根2*100*根2*100,你要保证角点相切的话,这个原始图像的大小需要根据旋转角度的大小随时改变。
比如旋转45度,先把源图像变到100*100(我说的源图像是里面有内容的图像),而你处理的图像还是200*200的带着黑框的图片。
进行旋转之后就是切边缘了。