Why would video files not open in OpenCV (both C & C++ APIs)?
I am swapping from EmguCV to OpenCV so that I can try some of the OpenCV functions that are not yet wrapped by EmguCV. However I'm failing to load my simple test video file, which loads without issue in EmguCV. Looking at the EmguCV source code I notice that they call the OpenCV C functions rather than C++ to initialise capture from a file (or a webcam) so I wrote the following test code (with help from stackoverflow). Here is my simple code
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;
}
When I run this I get the output
File exists
Failed to open file in OpenCV C++
Failed to open file in OpenCV C
This happens regardless of the file, i.e. it happens for "sample.wmv", "sample.avi", and even one of the OpenCV sample files "tree.avi".
Why? What is going on?
(I'm running OpenCV 2.4.6 on a Windows 8 and a Windows 8.1 machine.)
My experience with this tells me that it probably is a codec issue. Try to add the opencv_ffmpeg.dll to your project folder
It has opencv_ffmpeg246.dll in there already, should that do?
Yes that should be sufficient. However, could you try using an absolute path to your files instead of relative. Your code gets executed in a specific structure on windows, so absolute paths first to see if it actually works, then experimenting with relative paths.