我正在使用以下功能(成功)在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;
}
答案 0 :(得分:1)
我使用与您相同的源代码,遇到完全相同的问题 - 内存泄漏。唯一的区别是:我使用Qt5 for Windows,我正在加载单独的.jpg图像(实际上有数千个)。我尝试过相同的技术来防止崩溃,但是徒劳无功。我想知道你是否已经解决了这个问题?
类似的问题被描述为here(粗体段落,在页面的实际底部),但这是对以前版本的OpenCV接口的记录。作者说:
上述代码(函数检测和绘图)在无限循环中运行时会出现严重的内存泄漏,无法进行实时人脸检测。
我的谦虚猜测是,泄漏是由detectMultiScale()
方法中处理不当的资源引起的。我还没有检查出来,但是cvHaarDetectObjects()
方法解释here,可能是一个更好的解决方案(但是使用旧版本的OpenCV可能不是最好的主意)。
结合上一个链接的建议(在操作结束时添加此行:cvReleaseMemStorage(&storage)
),应该插入泄漏。
写这篇文章让我想试试这个,所以一旦我知道这是否有效,我会立刻通知你。
编辑:我的猜测可能是错误。尝试在每次检测后简单地清除“面部”向量,而不是释放它的记忆。我现在正在运行脚本很长一段时间,检测到几百个面孔,仍然没有问题的迹象。
编辑2:是的,就是这样。 每次检测后都添加faces.clean()
。一切都会正常工作。欢呼声。