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

wal*_*cer 5 c opencv memory-leaks

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

任何来自OpenCV大师的建议都会非常感激!

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

更新:Macports OpenCV现在已经很好了(现在已经有几个月了.我想我应该在这里发帖,这样人们就不会因为他们的OpenCV构建/安装使用macport而气馁.Macports是安装OpenCV的好方法.

wal*_*cer 0

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

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