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
之前,您正在尝试获取相机的捕获属性,这取决于可能无法获取正确属性的情况。这看起来不是问题所在,仅供参考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用于响应