检测人脸时,detectMultiScale中的内存泄漏

分形医生

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

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

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

我已经尝试过使用autoreleasepool围绕各个部分(因为在进行视频处理时在非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;
}
费斯科尔斯基

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

此处描述类似的问题(粗体显示在页面的底部),但这是以前版本的OpenCV接口的内容。作者说:

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

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

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

写这篇文章让我想尝试一下,所以我会在知道是否有效的情况下立即通知您。


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


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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章