1 回答
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的带着黑框的图片。
进行旋转之后就是切边缘了。
- 1 回答
- 0 关注
- 135 浏览
添加回答
举报