#include "cv.h"
#include "highgui.h"
#include "math.h"
int main (int argc, char **argv)
{
IplImage *src = 0;
IplImage *dst = 0;/* the first command line parameter must be image file name */
if ((argc == 2) && (src = cvLoadImage (argv[1], -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;
}这是旋转实现的代码。有几个问题不懂
1 m[0] = (float) (factor * cos (-angle * 2 * CV_PI / 180.)); 不明白为啥要乘以2。
2 以这种方式旋转得到的图片,如果已经某个点的坐标(x,y),怎么求旋转的图像中与之相对应的点的坐标(x1,y1)?
#include "highgui.h"
#include "math.h"
int main (int argc, char **argv)
{
IplImage *src = 0;
IplImage *dst = 0;/* the first command line parameter must be image file name */
if ((argc == 2) && (src = cvLoadImage (argv[1], -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;
}这是旋转实现的代码。有几个问题不懂
1 m[0] = (float) (factor * cos (-angle * 2 * CV_PI / 180.)); 不明白为啥要乘以2。
2 以这种方式旋转得到的图片,如果已经某个点的坐标(x,y),怎么求旋转的图像中与之相对应的点的坐标(x1,y1)?
第一个问题,OpenCV中图像直接做旋转的时候是以图像中心为旋转中心么?不是!是一个图像的某一个顶点。
你代码中是以哪里为中心的? 是图像中心。 根据几何关系,以顶点为中心和以图像中心为中心的话,角度是不是相差一倍?
第二个问题,点在原图中的直角坐标知道,旋转的中心知道,旋转的角度知道,求旋转后的直角坐标。是几何问题并不难解决吧。