2012-04-19 125 views
2

我有一个问题,通过使用OpenCV类VideoCapture在循环中打开许多视频文件(例如200)。下面你可以找到我的代码。OpenCV VideoCapture无法打开许多视频文件

更具体地说,我的程序成功地打开了一定数量的视频(通常是171-173),但是无法打开其他视频。我甚至试图打开总是相同的文件(如下面的例子),但行为是相同的。

在我看来,它不应该是一个内存泄漏问题(实际上有内存泄漏,但总共只消耗约50MB)。我认为这与以下事实有关:当每个视频被打开时,多个线程也被打开并且从不关闭,因此它们累积。但我不知道这是否是真正的原因,或者如果是,如何解决。

我使用Visual Studio编译和Windows 7操作系统。

如果您有任何线索和/或解决方案,请让我知道。

string video_filename = "MyVideo.mp4"; 
for(int j=0; j<200; j++) 
{ 
    VideoCapture video(video_filename); 
    if(!video.isOpened()) 
    { 
     cout << "Video #" << j << " could not be opened" << endl; 
    } 

    video.release(); // I've tried also to comment this out 
} 

我觉得你可以很容易地试着重现这个问题,因为代码很简单。

+0

第一个问题...视频文件有多大? – TomP89 2012-04-19 08:02:36

+0

相当小,介于1和20 MB之间 – user1343279 2012-04-19 08:15:21

+0

我想你可能会耗尽内存。你正在运行32位或64位的Windows?你有多少内存?最糟糕的情况下,200 x 20mb视频= 4GB – TomP89 2012-04-19 08:42:46

回答

1

我在Mac OS X上使用了OpenCV 2.3.0,并且在运行代码时没有任何问题。

您可能想要upgrade your version to 2.3.1,然后重试。如果问题仍然存在,则可能是Windows实施特有的问题,甚至可能只是针对Windows 7。

另一个疯狂的猜测是使用OpenCV的C接口而不是您正在使用的C++接口来实现上述程序马上。我过去遇到过问题(与视频无关),这些问题已经解决。我不建议混合接口,所以如果你打算做什么用的C接口,不要在程序中使用的OpenCV的C++接口

for (int j=0; j<200; j++) 
{ 
    CvCapture* capture = cvCaptureFromAVI("MyVideo.mp4"); 
    if (!capture) 
    { 
     cout << "Video #" << j << " could not be opened" << endl; 

     // Prevent calling cvReleaseCapture() on a capture that didn't succeeded 
     continue; 
    } 

    cvReleaseCapture(&capture); 
} 

我不记得是否它是cvCaptureFromAVI()cvCreateFileCapture()。请确认!

+0

谢谢@karlphillip。我会尝试你所说的 - 到目前为止,我一直在为MS Visual Studio使用预编译的OpenCV 2.3库。我也将在Linux上尝试相同的代码,并将发布将会发生的事情。 – user1343279 2012-04-22 10:07:44

相关问题