亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請教關于圖片大小不變,怎么把圖片移到中間去,圖片跟框框相切?

請教關于圖片大小不變,怎么把圖片移到中間去,圖片跟框框相切?

交互式愛情 2023-04-23 21:17:09
#include"cv.h"#include"highgui.h"#include"iostream" using namespace cv;using namespace std;int main(){Mat image=imread("mini.jpg");if(image.empty()){cout<<"read file failure"<<endl;return -1;}Point2f center=Point2f(image.cols/2,image.rows/2);//旋轉中心double angle=30;//旋轉角度double scale=1;//縮放尺度double degree=angle*CV_PI/180;double a=sin(degree),b=cos(degree);Mat image_rotate;image_rotate.cols= (image.cols*fabs(b)+image.rows*fabs(a));image_rotate.rows=(image.cols*fabs(a)+image.rows*fabs(b));// Point2f center=Point2f(image_rotate.cols/2,image_rotate.rows/2);//也不能把圖像移到中間// float map[6];Mat rotateMat(2,3,CV_32FC1,map);rotateMat=getRotationMatrix2D(center,angle,scale);// map[2]+=(image_rotate.cols-image.cols)/2;//map[5]+=(image_rotate.rows-image.rows)/2;Mat rotateImage;warpAffine(image,rotateImage,rotateMat,image_rotate.size());imwrite("rotate_image.jpg",rotateImage);namedWindow("window",1);imshow("window",rotateImage);waitKey(0);return 0;} //#include"iostream"//#include"cv.h"//#include"highgui.h" //using namespace cv;//using namespace std;//int main()//{//Point2f scrTri[3];//Point2f dsttri[3];//Mat warp_mat(2,3,CV_32FC1);//Mat rot_mat(2,3,CV_32FC1);//Mat scr,warp_dst,warp_rotate_dst;//scr=imread("lena.jpg");//warp_dst=Mat::zeros(scr.type(),scr.cols,scr.rows);//重置為0 //}
查看完整描述

1 回答

?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

#include "StdAfx.h"

#include "cv.h"

#include "highgui.h"

#include "math.h"


int main ()

{

IplImage *src = 0;

IplImage *dst = 0;

/* the first command line parameter must be image file name */

if ( (src = cvLoadImage ("d:\\Image\\mini.png", -1)) != 0)

{

int delta = 1;

int angle = 0;

int opt = 0;// 1: 旋轉加縮放

// 0:  僅僅旋轉

double factor;

dst = cvCloneImage (src);

cvNamedWindow ("src", 1);

cvShowImage ("src", src);

for (;;)

{

float m[6];

// Matrix m looks like:

//

// [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]

// [ m3  m4  m5 ]       [ A21  A22   b2 ]

//

CvMat M = cvMat (2, 3, CV_32F, m);

int w = src->width;

int h = 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

}

return 0;

}

參考程序如上所述,如果原始圖像大小不變是無法輸出到原始圖像的。

比如你原始圖像為200*200,旋轉45度,輸出到一個200*200的大小的圖像空間里,這個原始圖片的大小已經是原來的一半成了 根2*100*根2*100,你要保證角點相切的話,這個原始圖像的大小需要根據旋轉角度的大小隨時改變。

比如旋轉45度,先把源圖像變到100*100(我說的源圖像是里面有內容的圖像),而你處理的圖像還是200*200的帶著黑框的圖片。

進行旋轉之后就是切邊緣了。


查看完整回答
反對 回復 2023-04-27
  • 1 回答
  • 0 關注
  • 190 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號