【问题标题】:OpenCV 2.1 Memory leak on simple video streaming on Mac OSXOpenCV 2.1 Mac OSX 上简单视频流的内存泄漏
【发布时间】:2010-11-16 22:39:07
【问题描述】:

即使只是进行最基本的视频流传输,也会导致内存泄漏。

cvNamedWindow("1",0);
CvCapture *fc = cvCaptureFromCAM(0);
IplImage *frame = NULL;
CvSize frameSize;
frameSize.height = cvGetCaptureProperty(fc, CV_CAP_PROP_FRAME_HEIGHT);
frameSize.width = cvGetCaptureProperty(fc, CV_CAP_PROP_FRAME_WIDTH);

while (1) { 
    IplImage *wrkImage = NULL;

    frame = cvQueryFrame(fc);

    if (!frame) 
        break;

    wrkImage = cvCreateImage(frameSize, IPL_DEPTH_8U, 3);
    cvCopy(frame, wrkImage, NULL);

    cvShowImage("1", wrkImage);

    char c = cvWaitKey(33);
    if (c == 27) {
        break;
    }

    cvReleaseImage(&wrkImage);
}

显然,根据“学习 OpenCV”一书,我不应该发布“框架”,因为它是由 openCV 管理的,我可以“如果我这样做的话会出现问题”。如果我在调用 cvQueryFrame 后释放帧指针,它确实会导致问题。这本书还建议将 cvQueryFrame 指向的图像复制到其他地方来处理它,因为 cvQueryFrame 可能会重复回收同一块内存。因此,我在每个帧周期结束时都会发布 wrkImage。程序在几分钟后崩溃,并且像疯了一样泄漏内存!让我相信一些重大的事情正在像整个框架一样被泄露。我想知道是否有人在 Mac 上使用 OpenCV 2.1 来处理视频,并且发现这也是一个问题。或者,如果有人能在我的代码中看到我遗漏的漏洞。

非常感谢 OpenCV 大师的任何建议!

编辑:仔细检查程序并检查内存后,我怀疑问题出在 cvShowImage() 上。 cvShowImage 似乎分配了大约一帧的内存,似乎永远不会被回收。然后发现这个链接OpenCV cvShowImage Memory Leaks OSX似乎同意我的怀疑。可能在这里接近解决方案......很高兴看到我没有疯!

更新:Macports OpenCV 现在很好(并且已经使用了几个月。只是想我应该在这里发布,这样人们就不会因为使用 macports 进行 OpenCV 构建/安装而气馁。Macports 是一个很好的方法安装 OpenCV。

【问题讨论】:

  • 哦,我正在使用 2 周前安装的 OpenCV 2.1 的 Mac Ports 安装

标签: c memory-leaks opencv


【解决方案1】:

我提供的代码没有问题。当前 MacPorts 版本的 openCV 在 cvShowImage() 函数中存在内存泄漏。我手动下载并构建了最新版本,它不再泄漏内存。

对于阅读本文的任何人,如果您的 openCV 程序奇怪地泄漏内存,并且您使用 MacPorts 安装,我建议您下载源代码并使用 cmake 手动构建。

【讨论】:

    【解决方案2】:
    1. 您正在尝试在调用 cvQueryFrame 之前获取相机的捕获属性,具体取决于可能无法获取正确属性的情况。看起来这不是问题,仅供参考。

    2. 没有理由创建新的IplImage。如果您只想在窗口中显示它,请考虑更改您的捕获代码。

    新的捕获循环:

    while (true) { 
    
        frame = cvQueryFrame(fc);
    
        if (!frame) 
            break;
    
        cvShowImage("1", frame);
    
        char c = cvWaitKey(33);
        if (c == 27) {
            break;
        }
    
    }
    

    就像您在编辑中提到的那样,问题源于cvShowImage,紧随其后的是cvReleaseImage,除非您有这样做的原因,否则只需将其删除。

    【讨论】:

    • 这显然不是我想要做的。我的代码 sn-p 表明即使在非常基本的情况下,也会存在内存泄漏。所以是的,这样做是有原因的,即您应该在对其执行操作之前将图像数据复制到新的 IplImage 中。
    • 只是想帮助人,如果你不想要建议,那就不要问问题。
    • 不是在激怒你,只是指出确实有复制图像的原因。谢谢回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多