检测到面部时,detectMultiScale中的内存泄漏

时间:2013-08-14 14:20:09

标签: ios opencv image-processing

我正在使用以下功能(成功)在iOS中使用OpenCV检测面部,但根据乐器,它似乎每秒泄漏4-5Mb的内存。

定期从processFrame()调用该函数。

通过消除过程,它是face_cascade上调用detectMultiScale的行,导致问题。

我尝试过使用自动释放池的周边部分(因为我在进行视频处理时在非UI线程上释放内存之前遇到了这个问题),但这没有什么区别。

我也试过强迫脸部Vector释放它的记忆,但又无济于事。

有没有人有任何想法?

- (bool)detectAndDisplay :(Mat)frame
{
BOOL bFaceFound = false;

vector<cv::Rect> faces;
Mat frame_gray;

cvtColor(frame, frame_gray, CV_BGRA2GRAY);
equalizeHist(frame_gray, frame_gray);

// the following line leaks 5Mb of memory per second
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, cv::Size(100, 100));

for(unsigned int i = 0; i < faces.size(); ++i)
  {
  rectangle(frame, cv::Point(faces[i].x, faces[i].y),
            cv::Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
            cv::Scalar(0,255,255));
  bFaceFound = true;
  }

return bFaceFound;
}

1 个答案:

答案 0 :(得分:1)

我使用与您相同的源代码,遇到完全相同的问题 - 内存泄漏。唯一的区别是:我使用Qt5 for Windows,我正在加载单独的.jpg图像(实际上有数千个)。我尝试过相同的技术来防止崩溃,但是徒劳无功。我想知道你是否已经解决了这个问题?

类似的问题被描述为here(粗体段落,在页面的实际底部),但这是对以前版本的OpenCV接口的记录。作者说:

  

上述代码(函数检测和绘图)在无限循环中运行时会出现严重的内存泄漏,无法进行实时人脸检测。

我的谦虚猜测是,泄漏是由detectMultiScale()方法中处理不当的资源引起的。我还没有检查出来,但是cvHaarDetectObjects()方法解释here,可能是一个更好的解决方案(但是使用旧版本的OpenCV可能不是最好的主意)。

结合上一个链接的建议(在操作结束时添加此行:cvReleaseMemStorage(&storage)),应该插入泄漏。

写这篇文章让我想试试这个,所以一旦我知道这是否有效,我会立刻通知你。


编辑:我的猜测可能是错误。尝试在每次检测后简单地清除“面部”向量,而不是释放它的记忆。我现在正在运行脚本很长一段时间,检测到几百个面孔,仍然没有问题的迹象。


编辑2:是的,就是这样。 每次检测后都添加faces.clean()一切都会正常工作。欢呼声。