2

我在使用 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
}

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

4

1 回答 1

1

我在 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()。请验证!

于 2012-04-21T14:56:37.983 回答