【发布时间】:2010-11-16 22:39:07
【问题描述】:
即使只是进行最基本的视频流传输,也会导致内存泄漏。
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 现在很好(并且已经使用了几个月。只是想我应该在这里发布,这样人们就不会因为使用 macports 进行 OpenCV 构建/安装而气馁。Macports 是一个很好的方法安装 OpenCV。
【问题讨论】:
-
哦,我正在使用 2 周前安装的 OpenCV 2.1 的 Mac Ports 安装
标签: c memory-leaks opencv