【问题标题】:OpenCV VideoCapture fail to open many video filesOpenCV VideoCapture 无法打开许多视频文件
【发布时间】:2012-04-30 17:04:11
【问题描述】:

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

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

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

我使用Visual Studio编译,Windows 7 OS。

如果您有任何线索和/或解决方案,请告诉我。

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
}

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

【问题讨论】:

  • 第一个问题...视频文件有多大?
  • 很小,在 1 到 20 MB 之间
  • 好吧,我想您可能内存不足。你运行的是 32 位还是 64 位窗口?你有多少内存?最坏的情况,200 x 20mb 视频 = 4GB
  • - 我有 16GB 的 RAM。通过检查 Windows(64 位)的任务管理器,我的程序进程最多只需要 50 MB。这就是为什么我认为问题与内存无关。
  • 对不起,我看了你的帖子,好像你的内存泄漏只占用了 50mb。

标签: c++ opencv video


【解决方案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()。请验证!

【讨论】:

  • 谢谢@karlphillip。我会试试你所说的——直到现在我一直在使用预编译的 OpenCV 2.3 库用于 MS Visual Studio。我还将在 Linux 上尝试相同的代码,并将发布会发生什么。
猜你喜欢
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 2018-07-26
  • 2014-01-20
  • 2013-01-22
  • 2012-07-13
  • 2017-09-28
  • 2017-11-12
相关资源
最近更新 更多