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

Mac OSX上简单视频流的OpenCV 2.1内存泄漏,c,memory-leaks,opencv,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_FR

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

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似乎分配了大约一帧的内存,而这些内存似乎永远不会被回收。然后发现这个链接似乎与我的怀疑相符。可能接近解决方案了。。。很高兴看到我没疯

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

  • 在调用
    cvQueryFrame
    之前,您正在尝试获取相机的捕获属性,这取决于可能无法获取正确属性的情况。这看起来不是问题所在,仅供参考

  • 没有理由创建一个新的<代码> IplImage < /code >。如果你想做的就是把它显示在一个窗口中,考虑改变你的捕获代码。

    新的捕获循环:

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

    正如您在编辑中提到的,问题源于
    cvShowImage
    ,紧接着是
    cvReleaseImage
    ,除非您有理由这样做,否则请将其删除。

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


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

    哦,我使用的是我在两周前安装的openCV 2.1的Mac Ports安装,这显然不是我想要做的全部。我的代码片段是即使在非常基本的情况下,内存也会泄漏。所以,是的,这样做是有原因的,即在对图像数据执行操作之前,您应该将图像数据复制到一个新的IplImage中。只是想帮个忙,如果您不需要建议,那么就不要问任何问题。这不是在激怒您,只是指出存在问题请说明复制映像的原因。thx用于响应