『壹』 圖片處理-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的帶著黑框的圖片。
進行旋轉之後就是切邊緣了。