0

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

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。)

4

2 回答 2

3

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

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

于 2013-10-28T12:52:08.737 回答
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 可能是在发布模式下构建的,所以如果您的项目处于调试模式,它可能也无法工作。

于 2013-10-28T07:05:47.430 回答