我正在使用以下功能(成功)来在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] 删除。
我来说两句