捕获摄像头,使用PyrDown处理并保存视频
实验名:使用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; }
=====================================================================================
总结
一:实验总体完成得还可以,只是我老把一些代码打错,打字速度慢
出现的错误:
一:按照书上写视频保存的帧数及高宽时,
代码如下:
//定义保存视频的属性 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了^_^。