// 第二章 课后练习题
// 题号:2.3
// 功能:读取avi文件中的数据,将是视频文件的尺寸缩小一倍
// 并将处理后的视频文件数据数据做存盘处理。
#include "cv.h"
#include "highgui.h"
/*******************************************************************/
/* 函数名 : doPyrDown() 执行图形的向下图像金字塔
/* 参数 : input 输入图像
/* filter cvPyrDown()的默认参数
/* 功能 : 将输入图像input缩小一倍,并返回指向经过缩小处理图像的指针
/*******************************************************************/
IplImage *doPyrDown(IplImage *input,int filter=CV_GAUSSIAN_5x5)
{
//确保该图像的长度和宽度都能被2整除
assert(input->width%2==0 && input->height%2==0);
IplImage *output=cvCreateImage(cvSize(input->width/2,input->height/2),
input->depth,
input->nChannels);
assert(output!=NULL);
//对图像进行缩放处理
cvPyrDown(input,output,CV_GAUSSIAN_5x5);
return(output);
}
/**************************主函数**************************/
void main()
{
//创建一个capture对象用以从视频文件中读取数据
CvCapture *capture=cvCreateFileCapture("my.avi");
assert(capture!=NULL);
//用以从capture对象中获取图像帧
IplImage *image=cvQueryFrame(capture);
assert(image!=NULL);
//从capture对象中获得视频的播放速度和图像的大小
double fps=cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
//(注:此处也可替换成image->width/2 和 image->height/2 做为参数)
CvSize size=cvSize((int)(cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH)/2),(int)(cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT))/2);
//用以存放经过缩放处理后的图像
IplImage *change_image;
//创建一个视频写入对象
CvVideoWriter *writer=cvCreateVideoWriter("convert.avi",-1,fps,size);
while ((image=cvQueryFrame(capture))!=NULL)
{
//对图像进行缩放
change_image=doPyrDown(image);
//对图像进行垂直翻转
cvConvertImage(change_image,change_image,CV_CVTIMG_FLIP);
//将处理后的图像写入文件
cvWriteFrame(writer,change_image);
}
//释放资源
cvReleaseCapture(&capture);
cvReleaseVideoWriter(&writer);
}