【问题标题】:Why would video files not open in OpenCV (both C & C++ APIs)?为什么视频文件无法在 OpenCV(C 和 C++ API)中打开?
【发布时间】:2013-11-05 02:13:14
【问题描述】:

我正在从 EmguCV 交换到 OpenCV,以便我可以尝试一些尚未被 EmguCV 包装的 OpenCV 函数。但是,我无法加载我的简单测试视频文件,该文件在 EmguCV 中加载没有问题。查看 EmguCV 源代码,我注意到他们调用 OpenCV C 函数而不是 C++ 来初始化文件(或网络摄像头)的捕获,因此我编写了以下测试代码(在 this answer 的帮助下)。这是我的简单代码

int _tmain()
{
    string filename = "sample.wmv";
    if (!FileExists(filename.c_str))
    {
        cout << "File does not exist" << endl;  
        return -1;
    }
    else
    {
        cout << "File exists" << endl;
        VideoCapture cap (filename);
        if(!cap.isOpened())
        {
            cout << "Failed to open file in OpenCV C++" << endl;
            //Trying C API too just-in-case
            CvCapture* capture = cvCreateFileCapture(filename.c_str());
            if (!capture)
            {
                cout << "Failed to open file in OpenCV C" << endl;  
            }
            else
            {
                //Grab frames and do stuff
                cvReleaseCapture(&capture);
            }
            return -1;
        }
        else
        {
            //Grab frames and do stuff
        }
    }
    return 0;
}

当我运行它时,我得到了输出

File exists
Failed to open file in OpenCV C++
Failed to open file in OpenCV C

无论文件如何,都会发生这种情况,即“sample.wmv”、“sample.avi”甚至 OpenCV 示例文件“tree.avi”之一都会发生这种情况。

为什么?怎么回事?

(我在 Windows 8 和 Windows 8.1 机器上运行 OpenCV 2.4.6。)

【问题讨论】:

  • 您的系统是否拥有必要的权限?你能用 opencv 打开任何东西(即图像或 XML 文件等)吗?
  • 是的 - jpeg 可以正常打开。加上 EmguCV 项目成功打开相同的视频文件。
  • 你有样品吗?我可以为你试一试,然后我会告诉你它是否工作正常。
  • 谢谢@Mzk 我把sample.wmv放在这里了:dropbox.com/sh/1lp9vb9wgfg7l1l/FDddArU10f
  • 稍后我会告诉你的。谢谢。

标签: opencv video


【解决方案1】:

嗯..如果 emgu 和您的项目使用相同的版本,只需将 emgu 的 opencv dll(和所有其他 dll)复制到您的文件夹中。也许它会起作用。

其中一个原因可能是因为 opencv 不是用 ffmpeg (or you are missing them in your folder, just copy them over then it also might start to work) 构建的。 opencv 依靠 ffmpeg 完成几乎所有的解码。 opencv ffmpeg/s 可能是在发布模式下构建的,所以如果您的项目处于调试模式,它可能也无法工作。

【讨论】:

  • 感谢@zaw-lin 切换到 EmguCV 附带的 OpenCV DLL 是个好主意,但是当我从 EmguCV 切换到 OpenCV 时,我想使用最新版本,或者至少明白为什么我不能。我认为您对 ffmpeg DLL 的看法可能是正确的,尽管我已经将它们(调试和发布)复制到目录中。我最终意识到我需要在本地构建 DLL(或者可能只有 ffmpeg 一个?)和that fixed it
【解决方案2】:

看来,根据@tobias-senst 在another answer 上的建议,我需要在本地机器上构建 OpenCV,而不是依赖标准发行版提供的 DLL。让 OpenCV 在本地构建一直是一件令人头疼的事情(参见 hereherehere),但现在我参考了在这台机器上构建的 OpenCV 2.4.6 的副本,我可以打开视频文件。

我不知道为什么会这样,为什么要求中没有提到它,为什么其他人没有更频繁地遇到这个问题,也不知道默认部署有什么失败,但至少我已经修复了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 2017-05-03
    • 1970-01-01
    • 2013-05-06
    • 2015-09-04
    • 1970-01-01
    • 2017-11-25
    • 2014-10-24
    相关资源
    最近更新 更多