我正在从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。)
答案 0 :(得分:3)
看来,根据@ tobias-senst在another answer上的建议,我需要在本地计算机上构建OpenCV,而不是依赖于标准发行版提供的DLL。让OpenCV在本地构建是一件令人头疼的问题(请参阅here,here和here),但现在我引用了基于此构建的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可能是在发布模式下构建的,所以如果你的项目处于调试模式,它可能也不会工作。