利用OpenCV进行”视频的读取”与”保存视频文件或者图像”源码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

利用OpenCV进行”视频的读取”与”保存视频文件或者图像”源码#includeafx.h#includeiostream#includecv.h#includecxcore.h#includehighgui.husingnamespacestd;///////////////////////////////////////////////////////////作者:Flobert_Young//日期:2008-05-22//说明://需要配置OpenCV的开发环境,并且一定要确保当前Project里加入了cv.libcxcore.libhighgui.lib库//链接错误解决方法://编译时出现unresolvedexternalsymbol__endthreadex的处理方法//菜单Project-Settings…在C/C++页,//在Category下拉框里选择CodeGeneration,//然后在Userun-timelibrary里选择//DebugMultithreaded(Debug版本时用)//或者Multithreaded(release版本时用)./////////////////////////////////////////////////////////enumCaptureCase{CAP_FROM_CAM=0,CAP_FROM_VIDEO=1,};enumPlayVideoCase{FRAME_BY_FRAME=0,FRAME_BY_INDEX=1,};////////////////////////////////////////函数声明intFrameByFrame(CvVideoWriter*pVideoWriter,IplImage*pFrame,boolbSave,CvCapture*pCapture,char*pVideoSaveName,intnWaitKeyTime);intFrameByIndex(CvCapture*pCapture,IplImage*pFrame,intcap_prop,intcap_prop_value,CStringstrSaveImagePath);////////////////////////////////////////主函数部分intmain(){intret=0;boolbErr=0;boolbSave=0;//0–不保存视频文件;1–保存视频文件CaptureCasecap_case=CAP_FROM_VIDEO;//设置成从视频文件中获取图像PlayVideoCaseplay_case=FRAME_BY_FRAME;//设置成一帧一帧的播放视频文件intnWaitKeyTime=40;//显示图像所间隔的时间,以“毫秒”为单位////////////////////////////////////////变量声明CvCapture*pCapture=NULL;//用于在视频中捕获图像charszVideoFileName[]=“C:\\电影.AVI”;//!将打开的视频文件名设置成”C:\\1.mpg”charszVideoSaveName[]=“C:\\VideoSave.avi”;//!将保存视频文件的名字设置成”C:\\VideoSave.avi”CStringstrSaveImagePath=“C:\\”;//!保存图片的目录名CvVideoWriter*pVideoWriter=NULL;//用于保存视频文件IplImage*pFrame=NULL;IplImage*pImage=NULL;switch(cap_case){caseCAP_FROM_CAM://函数cvCaptureFromCAM()参数说明://要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。pCapture=cvCaptureFromCAM(-1);//和函数cvCreateCameraCapture()有什么区别???if(NULL==pCapture)//打开摄像头{cout”ERROR:摄像头读取失败!”endl;bErr=1;}break;caseCAP_FROM_VIDEO://打开视频文件pCapture=cvCaptureFromFile(szVideoFileName);//和函数cvCreateFileCapture()有什么区别???if(NULL==pCapture){cout”ERROR:视频文件读取失败!”endl;bErr=1;}break;}if(!bErr){switch(play_case){caseFRAME_BY_FRAME:FrameByFrame(pVideoWriter,pFrame,bSave,pCapture,szVideoFileName,nWaitKeyTime);break;caseFRAME_BY_INDEX://在窗口上显示视频的61%部分的那一帧图像intcap_prop_value=61;FrameByIndex(pCapture,pFrame,CV_CAP_PROP_POS_AVI_RATIO,cap_prop_value,strSaveImagePath);break;}}charch;cinch;returnret;}intFrameByFrame(CvVideoWriter*pVideoWriter,IplImage*pFrame,boolbSave,CvCapture*pCapture,char*pVideoSaveName,intnWaitKeyTime){intret=0;/****************************************//////////////////////////////1.逐帧读取视频intnCurFrameIndex=0;cvNamedWindow(“Frame_By_Frame”,1);//在图像窗口左上角显示“CurrentFrame:**”字符串CStringstrFrameString;CvFontfont;cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.5,0.5,0,2,8);//创建视频文件写入器//第二个参数fourcc–四个字符用来表示压缩帧的codec//例如,CV_FOURCC(‘P’,'I’,'M’,’1′)是MPEG-1codec,//CV_FOURCC(‘M’,'J’,'P’,'G’)是motion-jpegcodec等。//在Win32下,如果传入参数-1,可以从一个对话框中选择压缩方法和压缩参数。//这里是按20帧/s进行写入视频文件的,但是当右键”C:\\VideoSave.avi”属性-摘要,//发现“持续时间:0:00:02帧速率:500帧/秒”???//如果改成30帧/s,则发现属性改为“持续时间:0:00:01帧速率:750帧/秒”???if(1==bSave){pVideoWriter=cvCreateVideoWriter(pVideoSaveName,-1,20,cvSize(640,480),1);}if((NULL!=pVideoWriter&&bSave)||(!bSave)){while(pFrame=cvQueryFrame(pCapture)){if(1==bSave){//将获取的视频文件一帧一帧的写入要保存的视频文件中cvWriteFrame(pVideoWriter,pFrame);}nCurFrameIndex++;strFrameString.Format(“CurrentFrame:%d”,nCurFrameIndex);cvPutText(pFrame,strFrameString,cvPoint(5,pFrame-height-15),&font,cvScalar(0,255,0));cvShowImage(“Frame_By_Frame”,pFrame);if(0==bSave)//如果是保存视频时,则加快显示速度{cvWaitKey(nWaitKeyTime);}else{cvWaitKey(10);//如果选择保存视频时,好像不能够正常显示图像???}}if(1==bSave){//释放视频写入器cvReleaseVideoWriter(&pVideoWriter);}cvDestroyWindow(“Frame_By_Frame”);cvReleaseCapture(&pCapture);}else{cout”ERROR:创建CvVideoWriter*失败!”endl;}/****************************************/ret=1;returnret;}intFrameByIndex(CvCapture*pCapture,IplImage*pFrame,intcap_prop,intcap_prop_value,CStringstrSaveImagePath){intret=0;/****************************************//////////////////////////////2.读取第i帧视频cvNamedWindow(“FrameIndex_i”,1);//目前这个函数对视频文件只支持://CV_CAP_PROP_POS_MSEC,CV_CAP_PROP_POS_FRAMES,CV_CAP_PROP_POS_AVI_RATIOswitch(cap_prop){caseCV_CAP_PROP_POS_MSEC://读取视频中第cap_prop_value秒的图像cvSetCaptureProperty(pCapture,CV_CAP_PROP_POS_MSEC,cap_prop_value);break;caseCV_CAP_PROP_POS_FRAMES://读取视频中第cap_prop_value帧的图像cvSetCaptureProperty(pCapture,CV_CAP_PROP_POS_FRAMES,cap_prop_value);break;caseCV_CAP_PROP_POS_AVI_RATIO://读取视频中cap_prop_value%处的图像doubleratio=cap_prop_value/100.0;//100.0是为了将除法的结果转化成“浮点型”cvSetCaptureProperty(pCapture,CV_CAP_PROP_POS_AVI_RATIO,ratio);break;}if(pFrame=cvQueryFrame(pCapture)){//保存当前图像CStringstrSaveImageName;CStringstrTmp;strTmp.Format(“SaveImage_%d.bmp”,cap_prop_value);strSaveImageName=strSaveImagePath+strTmp;cvSaveImage(strSaveImageName,pFrame);cvShowImage(“FrameIndex_i”,pFrame);cvWaitKey(-1);}cvDestroyWindow(“FrameIndex_i”);cvReleaseCapture(&pCapture);/****************************************/ret=1;returnret;}

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功