使用OpenCV阅读mp4(Go Pro)视频

时间:2014-03-15 10:31:19

标签: c++ opencv video

在Visual Studio 2013中使用OpenCV和C ++界面时,我在浏览某些视频文件时遇到了困难。我已经能够阅读其他视频格式,所以相信我的代码没问题。

问题视频文件是使用Go Pro拍摄的,并且是mp4。我可以在使用经典媒体播放器的OpenCV的同一台机器上播放它们。我使用MediaInfo收集有关视频文件的信息:

格式:MPEG-4 格式简介:JVT 编解码器ID:avc1 文件大小:126 MiB

我尝试使用OpenCV的set函数显式提供fourcc代码,并提供divx作为代码和avc1,但没有运气。

我的程序代码如下:

int main(int argc, char** argv) {
    if (argc != 2) {
        help(argv);
        system("Pause");
        return 1;
    }

    std::string arg = argv[1];
    VideoCapture capture;
    capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('A', 'V', 'C', '1'));
    capture.open(arg);
    if (!capture.isOpened()) {
        cerr << "Failed to open video file!\n" << endl;
        help(argv);
        system("Pause");
        return 1;
    }
    return process(capture);
}

   void help(char** argv) {
        cout << "\n TBC" << endl;
    }

    int process(VideoCapture& src) {
        Scalar const LOW_HSV_THRESHOLD(120, 45, 75);
        Scalar const HIGH_HSV_THRESHOLD(140, 55, 85);
        string windowName[] = { "Original", "HSV", "In Range", "Binary"};
        namedWindow(windowName[0], CV_WINDOW_KEEPRATIO); 
        namedWindow(windowName[1], CV_WINDOW_KEEPRATIO); 
        namedWindow(windowName[2], CV_WINDOW_KEEPRATIO);
        namedWindow(windowName[3], CV_WINDOW_KEEPRATIO);
        Mat matOriginal;
        Mat matHsv;
        Mat matInRange;
        Mat dst;
        src >> matOriginal;

        cvtColor(matOriginal, matHsv, CV_BGR2HSV);
        GaussianBlur(matHsv, matHsv, Size(5, 5), 1.5);

        cvtColor(matOriginal, matInRange, CV_BGR2GRAY);
        threshold(matInRange, dst, 100, 255, THRESH_BINARY);
        //inRange(matHsv, LOW_HSV_THRESHOLD, HIGH_HSV_THRESHOLD, matInRange);
        imshow(windowName[0], matOriginal);
        imshow(windowName[1], matHsv);
        imshow(windowName[2], matInRange);
        imshow(windowName[3], dst);

        waitKey(0);
        return 0;
    }

}

非常感谢任何帮助。

非常感谢,

凯文

2 个答案:

答案 0 :(得分:9)

出于文档目的,我已将我的评论扩展为此问题的解决方案。

用于Windows的预构建opencv库可能尚未使用ffmpeg支持进行编译,这使得可以读取多种视频格式。

一个快速的肮脏解决方法是安装ffmpeg并将其添加到Windows PATH 环境变量。

然而,正确的解决方案是在安装ffmpeg之后从源代码构建opencv库。通过使用CMake-GUI简化了这一过程,您可以轻松配置opencv的多个选项,例如添加ffmpeg支持(USE_FFMPEG标志)。 Cmake还将生成Visual Studio项目文件,以便您轻松编译库。

有关更详细的指南,请查看official opencv documentation

上的视频指南

答案 1 :(得分:6)

我找到了一个更快的解决方法,这对我有用:

在项目Release文件夹(C:\ Users \ Test \ Projects \ MyProject \ Release)中复制文件opencv_ffmpeg2410.dll(2410来自opencv的使用版本,它可能与您不同)。在Visual Studio中以发布模式运行项目,它可以工作。

您不需要进行任何其他修改:如果它可以读取网络摄像头捕获但不能读取视频文件,您只需将opencv_ffmpeg2410.dll复制到项目的Release文件夹中(您可能在其中)以前从opencv的bin文件夹中复制了其他用过的dll。希望它有所帮助。