您的位置:首页 > 其它

cvCreateVideoWriter写出AVI文件为空

2017-11-11 21:53 435 查看
cvCreateVideoWriter写出AVI文件为空

运行第二章的第十个例子“写入AVI视频文件”时,写到磁盘的avi文件总是为空

程序如下:

#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include <iostream>
#include <opencv\cv.hpp>
#include "cv.h"
#include "highgui.h"
#include <cstring>
#include <fstream>
#include <iterator>
#include <vector>
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
CvCapture *capture = 0;
capture = cvCreateFileCapture("E:\\me.mp4");//获取视频
if (!capture){ return -1; };
IplImage* bgr_frame = cvQueryFrame(capture);
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));//视频流中的帧高度
CvVideoWriter *writer = cvCreateVideoWriter("E:\\me1.avi",-1, fps, size);
//CV_FOURCC('M','J','P','G')//表示codec的四个字符
IplImage* logpolar_frame = cvCreateImage(size, IPL_DEPTH_8U, 3);
while ((bgr_frame = cvQueryFrame(capture))!=NULL)
{
cvLogPolar(bgr_frame, logpolar_frame, cvPoint2D32f(bgr_frame->width/2,bgr_frame->height/2),
40, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS);
cvWriteFrame(writer, logpolar_frame);
}

cvReleaseVideoWriter(&writer);
cvReleaseImage(&logpolar_frame);
cvReleaseCapture(&capture);
return 0;
}
(注意,程序是应景改好的,错误的在书上)
调试时发现得到的writer为空,因为需要具备相应的 codec才能成功。
并且,记得用 cvReleaseVideoWriter()把CvVideoWriter数据结构释放,cvReleaseVideoWriter()非常重要,
因为AVI文件的文件格式收尾就是要用到cvReleaseVideoWriter(),也就是说,如果不用到 cvReleaseVideoWriter(),AVI文件就无法打开.

cvCreateVideoWriter()
它要放的参数分别为AVI文件名,AVI格式,FPS,CvSize数据结构及AVI文件的颜色种类,AVI的格式有很多种,由于影片有很多各个不同的压缩格式,因此,被分为非常多类,许多的种类也只是在学术界采用,real
player及media player很多都不适用,这边压缩格式的规格分为:

CV_FOURCC('P','I','M','1') MPEG-1 codec
CV_FOURCC('M','J','P','G') motion-jpeg codec (does not work well)
CV_FOURCC('M', 'P', '4', '2') MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') H263 codec
CV_FOURCC('I', '2', '6', '3') H263I codec
CV_FOURCC('F', 'L', 'V', '1') FLV1 codec

它的压缩格是参数方法被定义在"highgui.h"里的

解决方式:

cvCreateVideoWriter的使用说明中有一句话:Under Win32 it is possible
to pass -1 in order to choose compression method and additional compression parameters from dialog。使用-1替换CV_FOURCC,运行时会有提示让你自己选择 codec: 
CvVideoWriter *writer = cvCreateVideoWriter(output,-1,fps,size); 
出现如下提示: 


 
选择其中一个,继续运行,就可以成功写出文件了。

补充:cvWriteFrame不支持ROI

版本:2.4.3 

问题:VideoWriter保存的视频不支持中文路径 

解决办法:原来VideoWriter是调用ffmpeg编码,它只支持utf8格式的路径,所以在中文系统中不支持中文路径,把中文路径转换为utf8格式的路径就行。 

有一点奇怪就是,不知为什么VideoCapture却支持中文路径。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: