实验名:使用opencv编程,捕获摄像头,使用PyrDown处理并保存视频
功能:捕获摄像头,使用PyrDown处理并保存视频
作者:Spark
编译环境:opencv2.4.4及VS2008
参考书:《学习opencv》及大牛们的文档等等
================================================================================================
直接上代码:
//功能:捕获摄像头,使用PyrDown处理并保存视频
//作者;Spark
//日期:13-12-23
#include "stdafx.h"
#include "opencv2/opencv.hpp"
//定义和声明doPyrDown函数
IplImage* doPyrDown(IplImage* in, int filter= CV_GAUSSIAN_5x5)//IPL_GAUSSIAN_5x5
{
IplImage* out= cvCreateImage( //此语句是使out和in的大小及类型一样
cvSize(in->width/2, in->height/2),
in->depth,
in->nChannels
);
cvPyrDown(in, out,CV_GAUSSIAN_5x5);
//返回out
return out;
};
//主函数main
int _tmain(int argc, _TCHAR* argv[])
{
//创建两个窗口,一个是显示未处理前,一个事显示处理后的视频
cvNamedWindow("src_video");
cvNamedWindow("dst_video");
//定义捕获摄像头的指针capture并初始化
CvCapture* capture=0;
capture= cvCreateCameraCapture(0);
//检验capture是否捕获
if(!capture)
{
printf("Could not capture video!\n");
return -1;
}
IplImage* frame=0 ; //定义frame,用于获取视频的每一帧
//定义保存视频的属性
//double fps= cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
//CvSize size= cvSize((int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH), //宽
// (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT) //高
// );
int fps= 25;
int frameW= 640;
int frameH= 480;
int isColor= 1;
CvVideoWriter* writer =cvCreateVideoWriter(
"aboutme.avi",
CV_FOURCC('M', 'J', 'P', 'G'),
fps,
cvSize(frameW, frameH),
isColor
);
//while循环,cvPyrdown的处理,及显示并保存
while(true)
{
//使用cvQueryFrame获取视频的每一帧
frame= cvQueryFrame(capture);
//检验frame是否为零,若frame=0,退出while循环
if(!frame)
{
break;
}
//定义out_frame
IplImage* out_frame= cvCreateImage( //此语句是使out_frame和fram的大小及类型一样
cvSize(frame->width/2, frame->height/2),
frame->depth,
frame->nChannels
);
//显示原视频
cvShowImage("src_video", frame);
//使用cvPyrDown处理视频
out_frame= doPyrDown(frame);
//显示处理后视频
cvShowImage("dst_video", out_frame);
//保存处理后的视频
cvWriteFrame(writer, frame);
//wait
char c= cvWaitKey(3);
if(c==27)
{
break;
}
}
//释放内存及窗口
cvReleaseVideoWriter( &writer);
cvReleaseCapture( &capture);
cvDestroyWindow( "src_video");
cvDestroyWindow( "dst_video");
return 0;
}
=====================================================================================
总结
一:实验总体完成得还可以,只是我老把一些代码打错,打字速度慢
二:PyrDown处理还可以使用如下代码代替
cvPyrDown(frame, out_frame, CV_GAUSSIAN_5x5);
出现的错误:
一:按照书上写视频保存的帧数及高宽时,
代码如下:
//定义保存视频的属性
double fps= cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
CvSize size= cvSize((int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH), //宽
(int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT) //高
);
保存的视频只有0KB
囧啊。
自从按照大牛们的方法【我转载了】,视频不再为0Kb了^_^。