openCV cvCreateVideoWriter始终返回null

openCV cvCreateVideoWriter始终返回null,video,opencv,avi,Video,Opencv,Avi,我正试图用openCV在Mandriva Linux 2009.1下保存一个视频文件。 不幸的是,cvCreateVideoWriter总是返回null,尽管我可以查看和修改和mpeg文件,换句话说,cvCaptureFromCam、cvCaptureFromAvi、cvRetrieveFrame正在工作 我尝试了这个和这个编解码器中所有可能的编解码器。我还尝试了0表示未压缩的avi,而-1表示fourcc参数中的选择框,但没有弹出选择,什么也没有发生。我还将isColor修改为0 我在工作目录

我正试图用openCV在Mandriva Linux 2009.1下保存一个视频文件。 不幸的是,cvCreateVideoWriter总是返回null,尽管我可以查看和修改和mpeg文件,换句话说,cvCaptureFromCam、cvCaptureFromAvi、cvRetrieveFrame正在工作

我尝试了这个和这个编解码器中所有可能的编解码器。我还尝试了0表示未压缩的avi,而-1表示fourcc参数中的选择框,但没有弹出选择,什么也没有发生。我还将isColor修改为0

我在工作目录中也有写权限

以下是相关的代码片段:

    CvVideoWriter *writer = 0;
    int isColor = 1;
    int fps = 25;
    int frameW = 640;
    int frameH = 480;


    if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
        capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );
    else if( argc == 2 ) {
        printf("argc == 2 :%s:\n", argv[1] );
        capture = cvCaptureFromFile( argv[1] );
    }

    cvInitSystem(argc,argv);

 writer = cvCreateVideoWriter("out.avi",CV_FOURCC('I','Y','U','V'),fps,cvSize(frameW,frameH),isColor);

可能是什么问题?

这将取决于OpenCV库的配置方式。特别是,我认为必须定义
HAVE\u FFMPEG
,以便处理'IYUV'FOURCC值。您的库是用
构建的吗?是否定义了

默认的writer对象(当fourcc为零时创建,或者fourcc值不由一个可用的处理程序处理)每帧创建一个图像文件。在这种情况下,文件名需要类似于“文件%04d.foo”或“文件0001.foo”,否则编写器创建失败。您可以尝试将类似“test0001.png”的内容传递给filename参数作为实验,以验证是否成功创建了默认图像编写器(这不会直接起作用,但可能是确认可用编写器未识别您的fourcc值的一种方法)


根据文档,当fourcc equal-1时打开选择对话框的选项是特定于Windows的。

我阅读了你的帖子、Lance的回复和你对它的评论,最后找到了我自己的解决方法,并决定为每个与该问题有斗争的人添加一些注释

首先要检查的是CMake是否使用FFmpeg构建了OpenCV。我快速而可怕的方法是,在安装过程中再次使用标记和参数运行
cmake
。在输出的最后,将有关于将安装哪些组件的日志。如果您的参数复制了实际安装过程中使用的参数,您将获得有关已安装的参数的信息

接下来,您可能需要检查linux系统上可用的编解码器编码器和解码器。我通过使用
ffmpeg-codecs
来实现这一点

第三个注意事项是为
cvCreateVideoWriter
设置的可靠原始参数:

“a0000.png”,0,fps,大小,0

fps
size
以下是分别包含fps和frame_size字段值的变量。你会看到一袋袋的图像——兰斯·理查森和莱斯已经注意到了这一点

最后,对于使用FFmpeg构建OpenCV并安装XVID编码器的系统,我将这些参数插入
cvCreateVideoWriter

“/home/me/openCVOut/a.avi”,CV_FOURCC('X','V','I','D'),fps,大小

最终得到我想要的


希望我的回答有用

谢谢你的回复。虽然我不在那里,但我可以走得更远。我使用的是内置的mandriva opencv-devel-1.1.0-0.pre1.2mdv2009.1包。由于cvCaptureFromAvi和Cam正在工作,我可以在窗口中看到视频,我想FFMPEG支持还可以。你是对的。当我尝试将test0001.png作为filename参数时,它会工作,并在工作目录中创建大量图像。因此,现有的编剧肯定有问题。我还了解到-1 for fourcc仅适用于Windows,这只是一次尝试。根据highgui.h#define CV_fourcc_DEFAULT-1/*对指定的文件名使用默认编解码器(仅限Linux)*/因此它也应该在Linux上使用默认编解码器。有趣的是printf(“fourcc:%lf\n”,cvGetCaptureProperty(capture,CV_CAP_PROP_fourcc));对于mpeg-2文件的捕获,返回0,而opencv可以在单独的窗口中显示电影的原始版本和运动检测版本。我从未设法使视频编写器在opencv 1中工作。要么我为writer设置了NULL,要么它生成了损坏的帧。升级到OpenCV 2解决了这两个问题。