在对视频进行处理时,很多需要保存处理后的结果,因而想借助于opencv将处理过后的视频保存下来。opencv中保存视频的方式分为 VideoWriter和CvVideoWriter两个版本的,其中前者是对应Mat,后者对应的是IplImage*的。现在多用的是前者,但很多较老的代码中还是用的CvVideoWriter这中方式的,本文对这两种都简要介绍一下。首先是VideoWriter,基本就是将视频的每一帧读入到要保存的视频中。
#include
#include
using namespace cv;
void main()
{
VideoCapture capture(0);
VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(640, 480));
while (capture.isOpened())
{
Mat frame;
if ((frame.rows==0)||(frame.cols==0))
{
printf("frame capture failed\n");
system("pause");
exit(0);
}
capture >> frame;
writer << frame;
imshow("video", frame);
if (cvWaitKey(20) == 27)
{
break;
}
}
}
其中VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(640, 480));这一行代码中后面的两个参数分别是帧率与保存视频的宽和高。一般可利用下列两行代码获取,上述示例代码中为了方便,直接用的指定的值。
int rate = capture.get(CV_CAP_PROP_FPS);//帧率
writer.open("C:\\Users\\lenovo\\Documents\\04.avi",CV_FOURCC('M', 'J', 'P', 'G'),rate,Size(frame.cols,frame.rows),true);
第二中就是CvVideoWriter,其代码也基本一样,只是老版本的opencv中的用法。
char videoName[128] = "F://test//test1.mp4";//要处理的视频
char reslutVideoName[128] = "F://result//result3.avi";//处理好保存的视频,只能保存为AVI格式
CvCapture* capture0 = cvCaptureFromFile(videoName);
if (!capture0) {
fprintf(stderr, "Couldn't initialize capturing....\n");
}
CvSize size = cvSize(
(int)cvGetCaptureProperty(capture0, CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty(capture0, CV_CAP_PROP_FRAME_HEIGHT));
// video writer
CvVideoWriter* writer = cvCreateVideoWriter(reslutVideoName, CV_FOURCC('M', 'J', 'P', 'G'), 25,size);
IplImage* frame = NULL;
while(1)
{
frame = cvQueryFrame(capture0);
if (NULL == frame) {
break;
}
//中间省略对frame进行处理的代码
cvWriteFrame(writer, frame);
}
上述的代码都是从我从自己的代码中截取出与保存视频相关的片段的,应该是可以运行的。(我自己的工程可以成功运行并保存处理后的视频)