OpenCV 2.1 Mac OSX上简单视频流的内存泄漏

时间:2010-11-16 22:39:08

标签: c memory-leaks opencv

即使只做最基本的视频流也会导致内存泄漏。

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现在已经很好了(现在已经有几个月了。只是想我应该发布这里,所以人们不会因为他们的OpenCV构建/安装使用macport而气馁.Macports是一个很好的方式安装OpenCV。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:-1)

  1. 您正在尝试在调用cvQueryFrame之前获取摄像头的捕获属性,具体取决于可能无法获得正确属性的情况。看起来不是那个问题,仅供参考。

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

  3. 新捕获循环:

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

    正如您在编辑中提到的,问题源于cvShowImage,紧接着是cvReleaseImage,除非您有原因,只需删除它。