opencv 的入门程序,图像翻转,请我打问好的给解释下,还有程序的大意,谢谢了
#include"cv.h"#include"highgui.h"#include"math.h"intmain(intargc,char**argv)?{IplImag...
#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);?(每个参数都解释下,还有cv_32F啥意思)
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;?(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;
} 展开
#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);?(每个参数都解释下,还有cv_32F啥意思)
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;?(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个回答
展开全部
int main (int argc, char **argv)?//入口参数,cmd运行时加在程序名后,也可以在VC工程设置下设置;
IplImage *src = 0;?//源图像指针,用来指向你加载的图像
IplImage *dst = 0;?//目标图像指针,用来指向你转换后的图像
/* the first command line parameter must be image file name */? //这不是注释吗?就是说你输入的第一个命令行参数必须是图像命,或路径全名,例如
你的程序叫AAA,图像叫a.jpg.可以再cmd 下这么输入 AAA a.jpg (回车),就运行了
if ((argc == 2) && (src = cvLoadImage (argv[1], -1)) != 0)?//如上面的输入,argc 来计数你的输入参数,程序名也算一个,例如上边的输入argc=2,argv[0] = "AAA",argv[1] = "a.jpg"
float m[6];?//就是浮点型的数组,用来存数据
CvMat M = cvMat (2, 3, CV_32F, m);?(每个参数都解释下,还有cv_32F啥意思)
//构造一个2行3列的CvMat类型(是矩阵),CV_32F是opencv的类型,是指32位浮点数,也就是矩阵存储该类型值,而m正好是2*3 = 6个浮点型数据,就正好赋给矩阵了
factor = (cos (angle * CV_PI / 180.) + 1.0) * 2;?//计算你的翻转角度和缩放比例,这个是几何模型的关系
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;?(0.5f事什么意思)
m[5] = h * 0.5f;?
//以上是计算变换矩阵,就是你的原始图像要基于你提供的变换矩阵模式来进行变换。其中m[0],m[1],m[3],m[4]是可以看做2*2的旋转矩阵,而m[2],m[5]是平移向量,你把这个数组画出来就明白了,这里涉及到的是图形变换的知识,你可以查“仿射变换”,0.5f就是浮点数0.5,在计算机里直接写0.5是double形的,精度问题
// dst(x,y) = A * src(x,y) + b?//就是变换公式,指的是下面的变换使用到的公式
cvZero (dst);?//矩阵清零
cvGetQuadrangleSubPix (src, dst, &M);?
//这个函数以子象素精度从图像 src 中提取四边形,使用子象素精度,并且将结果存储于 dst ,计算公式是:
dst(x + width(dst) / 2,y + height(dst) / 2) = src(A11x +A12y +b1,A21x+ A22y + b2)
其中 A和 b 均来自映射矩阵,就是你的m
cvNamedWindow ("dst", 1);??
//初始化窗口,名字是dst,参数1指的是窗口随图像大小变化
cvShowImage ("dst", dst);?
//将你的目标图像dst显示到窗口dst上,显示出来
angle = (int) (angle + delta) % 360;?
//这个不是角度在变化吗?你可以看到图像在翻转啊,否则的话你只能看到一帧变换后的图像。
IplImage *src = 0;?//源图像指针,用来指向你加载的图像
IplImage *dst = 0;?//目标图像指针,用来指向你转换后的图像
/* the first command line parameter must be image file name */? //这不是注释吗?就是说你输入的第一个命令行参数必须是图像命,或路径全名,例如
你的程序叫AAA,图像叫a.jpg.可以再cmd 下这么输入 AAA a.jpg (回车),就运行了
if ((argc == 2) && (src = cvLoadImage (argv[1], -1)) != 0)?//如上面的输入,argc 来计数你的输入参数,程序名也算一个,例如上边的输入argc=2,argv[0] = "AAA",argv[1] = "a.jpg"
float m[6];?//就是浮点型的数组,用来存数据
CvMat M = cvMat (2, 3, CV_32F, m);?(每个参数都解释下,还有cv_32F啥意思)
//构造一个2行3列的CvMat类型(是矩阵),CV_32F是opencv的类型,是指32位浮点数,也就是矩阵存储该类型值,而m正好是2*3 = 6个浮点型数据,就正好赋给矩阵了
factor = (cos (angle * CV_PI / 180.) + 1.0) * 2;?//计算你的翻转角度和缩放比例,这个是几何模型的关系
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;?(0.5f事什么意思)
m[5] = h * 0.5f;?
//以上是计算变换矩阵,就是你的原始图像要基于你提供的变换矩阵模式来进行变换。其中m[0],m[1],m[3],m[4]是可以看做2*2的旋转矩阵,而m[2],m[5]是平移向量,你把这个数组画出来就明白了,这里涉及到的是图形变换的知识,你可以查“仿射变换”,0.5f就是浮点数0.5,在计算机里直接写0.5是double形的,精度问题
// dst(x,y) = A * src(x,y) + b?//就是变换公式,指的是下面的变换使用到的公式
cvZero (dst);?//矩阵清零
cvGetQuadrangleSubPix (src, dst, &M);?
//这个函数以子象素精度从图像 src 中提取四边形,使用子象素精度,并且将结果存储于 dst ,计算公式是:
dst(x + width(dst) / 2,y + height(dst) / 2) = src(A11x +A12y +b1,A21x+ A22y + b2)
其中 A和 b 均来自映射矩阵,就是你的m
cvNamedWindow ("dst", 1);??
//初始化窗口,名字是dst,参数1指的是窗口随图像大小变化
cvShowImage ("dst", dst);?
//将你的目标图像dst显示到窗口dst上,显示出来
angle = (int) (angle + delta) % 360;?
//这个不是角度在变化吗?你可以看到图像在翻转啊,否则的话你只能看到一帧变换后的图像。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询