【问题标题】:Reading mp4 (Go Pro) video using OpenCV使用 OpenCV 阅读 mp4 (Go Pro) 视频
【发布时间】:2014-04-20 18:45:10
【问题描述】:

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

问题视频文件是使用 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;
    }

}

任何帮助将不胜感激。

非常感谢,

凯文

【问题讨论】:

  • 你使用的是支持 ffmpeg 编译的 opencv 吗?
  • 可能不是,在 Visual Studio 中设置 OpenCV 时,我刚刚从 SourceForge(从 OpenCV 站点重定向)下载了标准包,并且只包含了头文件和库文件。所以在回答我不太确定。
  • 我的猜测是,如果您使用的是未使用 ffmpeg 支持构建的 OpenCV 库,则可能不支持特定的编解码器。我想不出一个简单的方法来测试它。作为一种 hacky 解决方法,尝试将您的视频转换为 opencv 可以读取的更简单的视频格式。您可以使用ffmpeg 进行转换。如果这不起作用,安装 ffmpeg 并将其添加到您的 PATH,使用 cmake 自己从源代码构建 opencv 以使用 ffmpeg 支持对其进行配置。然后 cmake 将为您生成 Visual Studio 项目文件。 HTH
  • 会试一试。非常感谢。

标签: c++ opencv video


【解决方案1】:

出于文档目的,我已扩展我的评论以解决此问题。

windows 的预构建 opencv 库可能未使用 ffmpeg 支持进行编译,因此可以读取多种视频格式。

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

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

如需更详细的指南,请查看official opencv documentation 页面上的视频指南

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我在 Windows 中使用 OpenCV 3.2 和 Python 2.7。使用我的 python 脚本将 DLL 复制到同一个文件夹对我有用。我想你也可以将它添加到 PATH 中。
    猜你喜欢
    • 2013-01-27
    • 1970-01-01
    • 2015-12-05
    • 2015-08-11
    • 2018-03-29
    • 2020-09-24
    • 2019-12-07
    • 2020-02-12
    • 2015-06-24
    相关资源
    最近更新 更多