为了账号安全,请及时绑定邮箱和手机立即绑定

请教关于图片大小不变,怎么把图片移到中间去,图片跟框框相切?

请教关于图片大小不变,怎么把图片移到中间去,图片跟框框相切?

交互式爱情 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 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信