即使只做最基本的视频流也会导致内存泄漏。
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。
答案 0 :(得分:0)
我提供的代码没有任何问题。 openCV的当前MacPorts构建在cvShowImage()函数中有内存泄漏。我手动下载并构建了最新版本,它不再泄漏内存。
对于任何阅读此内容的人来说,如果您的openCV程序奇怪地泄漏内存,而您使用MacPorts安装,我建议您使用cmake手动下载源代码并构建。
答案 1 :(得分:-1)
您正在尝试在调用cvQueryFrame
之前获取摄像头的捕获属性,具体取决于可能无法获得正确属性的情况。看起来不是那个问题,仅供参考。
没有理由创建新的IplImage
。如果您要做的只是在窗口中显示它,请考虑更改捕获代码。
新捕获循环:
while (true) {
frame = cvQueryFrame(fc);
if (!frame)
break;
cvShowImage("1", frame);
char c = cvWaitKey(33);
if (c == 27) {
break;
}
}
正如您在编辑中提到的,问题源于cvShowImage
,紧接着是cvReleaseImage
,除非您有原因,只需删除它。