1

我正在使用以下函数(成功)在 iOS 中使用 OpenCV 检测人脸,但根据 Instruments,它似乎每秒泄漏 4-5Mb 的内存。

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

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

我已经尝试使用自动释放池包围部分(因为在进行视频处理时在非 UI 线程上释放内存之前我遇到了这个问题),但这并没有什么不同。

我也尝试过强制 Faces 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;
}
4

1 回答 1

1

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

此处描述了类似的问题(粗体段落,在页面的真正底部),但是这是针对先前版本的 OpenCV 界面的记录。作者说:

上述代码(函数检测和绘制)在无限 for 循环中运行以进行实时人脸检测时存在严重的内存泄漏。

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

结合上一个链接的建议(在操作末尾添加此行cvReleaseMemStorage(&storage):),应该堵塞泄漏。

写这篇文章让我想试试这个,所以一旦我知道这是否有效,我会尽快告诉你。


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


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

于 2013-09-13T00:36:23.680 回答