即使只是做最基本的视频流,也会导致内存泄漏。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。
哦,我正在使用2周前安装的OpenCV 2.1的Mac Ports安装 – wallacer 2010-11-16 22:42:02