OpenCV2.4从视频中捕获帧的可能错误

时间:2012-09-14 11:03:47

标签: c++ opencv ffmpeg

是否存在 OpenCV2.4 highgui 中的错误,用于从Windows中的视频捕获帧?

我安装了两个预编译库,我编译的库,我可以完美地编译所有内容,如果

我可以运行我的程序

他们是基于图像的。问题仅适用于视频。 OpenCV总是崩溃在这个函数中:

 virtual IplImage* retrieveFrame(int)
    {
        unsigned char* data = 0;
        int step=0, width=0, height=0, cn=0;

        if(!ffmpegCapture ||
           !icvRetrieveFrame_FFMPEG_p(ffmpegCapture,&data,&step,&width,&height,&cn)) <-------CRASHES HERE
           return 0;
        cvInitImageHeader(&frame, cvSize(width, height), 8, cn);
        cvSetData(&frame, data, step);
        return &frame;
    }

这是在 cap_ffmpeg.cpp 类中,由 VideoCapture 调用。

我尝试了2.4.2和2.4.9版本。我的程序正在使用opencv2

工作

更多信息

  • Windows 7

  • 使用cmake构建项目(重要的是因为cmake可能没有构建/找到正确的编解码器)

  • VisualStudio 9 2008

  • OpenCV 2.4.2

修改

看起来它实际上是bug,所以,我怎样才能解决这个问题并更改我的代码以便能够读取avi文件?

3 个答案:

答案 0 :(得分:5)

作为临时解决方案,我决定重新编码视频,以便OpenCV不使用ffmpeg。我使用 VirtualDub microsoft video 1 压缩,它使用“msvidc32.dll”驱动程序。

它适用于我的所有视频,所以现在已足够,因为我可以继续在Windows中使用OpenCV。

enter image description here

答案 1 :(得分:1)

我有类似的问题。我下载了VirtualDub,但由于其FMP4编码,它没有打开我的一个avi视频。所以最后,解决问题的解决方案是安装ffdshow,一个用于windows的解码器。请看这个链接:http://www.moviecodec.com/video-codecs/fmp4-codec-with-virtualdub-45814/

然后我不再需要使用VirtualDub重新编码我的视频了!

答案 2 :(得分:1)

如果您使用的是x64。请使用opencv_ffmpeg245_64.dll这个解决可以解决问题。或者将opencv_ffmpeg245_64.dll重命名为opencv_ffmpeg245.dll可能会解决问题。