2010-11-16 57 views
5

即使只是做最基本的视频流,也会导致内存泄漏。OpenCV 2.1 Mac OSX上简单视频流的内存泄漏

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,似乎同意我的怀疑。可能接近这里的解决方案...很高兴看到我不疯狂!我们应该在这里发布这个,所以人们不会因为他们的OpenCV构建/安装而使用macports而感到气馁.Macports是一款非常棒的产品。方式安装OpenCV。

+0

哦,我正在使用2周前安装的OpenCV 2.1的Mac Ports安装 – wallacer 2010-11-16 22:42:02

回答

0

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

对于读这个的人,如果你的openCV程序好奇地泄漏内存,并且你使用MacPorts安装,我建议使用cmake手动下载源代码和构建。

-1
  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,除非你有做一个原因,只是将其删除。

+1

这显然不是我想要做的。我的代码片段显示即使在非常基本的情况下,也存在内存泄漏。所以是的,有这样做的理由,即您应该在执行操作之前将图像数据复制到新的IplImage中。 – wallacer 2010-11-23 01:35:26

+0

只是试图帮助男人,如果你不想要建议,那么不要问一个问题。 – tbridge 2010-11-23 03:40:43

+0

并没有燃烧你,只是指出复制图像的确有一个原因。 thx的回应 – wallacer 2010-11-26 00:35:04