//////////////////////////////////////////////////////////
// //
//这些函数实现图像的几何变换 //
// //
//////////////////////////////////////////////////////////
#include "cv.h"
#include "math.h"
#include "highgui.h"
//图像的旋转
void my_circumrotate(IplImage * src)
{
IplImage *dst = 0; //目标图片指针
int delta = 1; //旋转角度增量
int angle = 45; //初始旋转角度
int opt = 0; // 1: 旋转加缩放
// 0: 仅仅旋转
double factor; //乘数,用于改变M[0],M[1]的值
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;//4
else // 仅仅旋转
factor = 1; //不缩放图像
m[0] = (float) (factor * cos (-angle * 2 * CV_PI / 180.)); //factor=1,对积没影响
m[1] = (float) (factor * sin (-angle * 2 * CV_PI / 180.)); //factor=1,对积没影响
m[3] = -m[1]; //0
m[4] = m[0]; //1
// 将旋转中心移至图像中间
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);
cvWaitKey(-1);
// angle = (int) (angle + delta) % 360; //改变旋转角度,每次增加90度
// } // for-loop ********************************************************
}
//图像的翻转
void my_reversal(IplImage * src)
{
int c=0;
IplImage *dst = 0; //目标图片指针
int delta = 90; //旋转角度增量,设置90度。
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);//role col
int w = src->width;
int h = src->height;
if (opt) // 旋转加缩放
factor = (cos (angle * CV_PI / 180.) + 1.0) * 2;//4
else // 仅仅旋转
factor = 1; //不缩放图像
m[0] = (float) (factor * cos (angle * CV_PI / 180.));//factor=1,对积没影响
m[1] = (float) (factor * sin (angle * CV_PI / 180.));//factor=1,对积没影响
m[3] = -m[1]; //0
m[4] = m[0]; //1
//
m[2] = w * 0.5f;
m[5] = h * 0.5f;
// dst(x,y) = A * src(x,y) + b
cvZero (dst);//矩阵置零
if(c==0)
{
cvGetQuadrangleSubPix (src, dst, &M); //实现90度翻转**********
}
else
cvGetQuadrangleSubPix (dst, dst, &M);
cvNamedWindow ("dst", 1);
cvShowImage ("dst", dst);
if (cvWaitKey (1000) == 27) //ESC
break;
angle = (int) (angle + delta) % 360; //改变旋转角度,每次增加90度
} // for-loop
}
//图像的镜像变换
//1:水平镜像 0:垂直镜像
IplImage * my_picMinitor(IplImage* src,int flag)
{
IplImage* dst;
if(flag<=0)
flag=0;
else
flag=1;
dst=cvCloneImage(src);
cvFlip(src,dst,flag); //镜像函数
cvNamedWindow("dst",1);
cvNamedWindow("src",1);
cvShowImage("src",src);
cvShowImage("dst",dst);
cvWaitKey(-1);
return dst;
}
//图像的放大、缩小
IplImage * my_picResize(IplImage* src,float scale)
{
float a=scale; //放大倍数
IplImage* dst;
CvSize dstSize;
dstSize.width=src->width*a;
dstSize.height=src->height*a;
dst=cvCreateImage(dstSize,src->depth,src->nChannels);
cvResize(src,dst,CV_INTER_LINEAR); //
cvNamedWindow("src",1);
cvShowImage("src",src);
cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);
cvShowImage("dst",dst);
cvWaitKey(-1);
return dst;
}
//第二个图像翻转函数——垂直翻转
IplImage * my_second(IplImage * src)
{
IplImage * dst;
dst=cvCloneImage(src);
cvNamedWindow("src",1);
cvShowImage("src",src);
cvConvertImage(src,dst,CV_CVTIMG_FLIP);//垂直翻转,和180度翻转效果一样
cvNamedWindow("dst",1);
cvShowImage("dst",dst);
cvWaitKey(-1);
return dst;
}
//图像翻转的第二个实现
//void cvConvertImage( const CvArr* src, CvArr* dst, int flags=0 );
//
//argc:向main函数传递的参数个数
//argv:用于存储所传递的参数
int main (int argc, char **argv)
{
IplImage * src;
/* the first command line parameter must be image file name */
if ((argc == 2) && (src = cvLoadImage (argv[1], -1)) != 0) //用cvLoadImage函数载入图片
{
int id=3; //改变id的值调用不同的函数
switch(id)
{
case 1:
my_circumrotate(src); //图像的旋转
break;
case 2:
my_reversal(src); //图像的翻转
break;
case 3:
my_picMinitor(src,1); //图像的水平镜像
break;
case 4:
my_picMinitor(src,0); //图像的垂直镜像
break;
case 5:
my_picResize(src,0.25); //图像的缩小、放大
case 6:
my_second(src); //第二个翻转函数——垂直翻转
break;
default:
break;
}
}
return 0;
}