OpenCV VideoCapture 無法打開許多視頻檔案

OpenCV VideoCapture fail to open many video files

本文关键字:VideoCapture OpenCV      更新时间:2023-10-16

我使用 OpenCV 类 VideoCapture 循环打开许多视频文件(例如 200)时遇到问题。您可以在下面找到我的代码。

更具体地说,我的程序成功打开了一定数量的视频(通常是 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
}

我认为您可以轻松地尝试重现此问题,因为代码非常简单。

我在Mac OS X上使用OpenCV 2.3.0,运行代码没有问题。

您可能需要将版本升级到 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().请核实!