为什么视频文件不能在OpenCV(C& C ++ API)中打开?

时间:2013-10-25 20:13:34

标签: opencv video

我正在从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。)

2 个答案:

答案 0 :(得分:3)

看来,根据@ tobias-senst在another answer上的建议,我需要在本地计算机上构建OpenCV,而不是依赖于标准发行版提供的DLL。让OpenCV在本地构建是一件令人头疼的问题(请参阅hereherehere),但现在我引用了基于此构建的OpenCV 2.4.6的副本机器我可以打开视频文件。

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

答案 1 :(得分: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可能是在发布模式下构建的,所以如果你的项目处于调试模式,它可能也不会工作。