使用OpenCV / EmguCV提高人脸检测性能

时间:2011-07-15 15:44:25

标签: c# opencv computer-vision emgucv face-detection

我目前正在使用EmguCV(OpenCV C#wrapper)成功地实时检测面部(网络摄像头)。我得到7 FPS。

现在我正在寻求提高性能(并节省CPU周期),我正在寻找选择,这是我的想法:

  • 检测面部,拾取面部特征并尝试在下一帧中找到这些特征(使用SURF算法),这样就变成了“面部检测+跟踪”。如果未找到,请再次使用面部检测。

  • 检测面部,在下一帧中,尝试检测面部先前所在的ROI中的面部(即,在图像的较小部分中查找面部)。如果找不到脸部,请尝试再次在整个图像中查找。

  • 侧面想法:如果没有检测到2-3帧的脸部,并且图像中没有移动,则在检测到移动之前不要再尝试检测脸部。

你对我有什么建议吗?

感谢。

3 个答案:

答案 0 :(得分:2)

  • 对于SURF算法,您可以尝试,但我不确定它是否在脸上提供相关功能,可能在眼睛周围,或者如果您是近距离并且有皮肤不规则,或者可能在头发上如果分辨率足够。而且,SURF并不是真的很快,如果你想节省CPU时间,我会避免做更多的计算。

  • roi是一个好主意,你可以通过做一个camshift算法来选择它,它不会节省很多CPU,但你可以试试,因为camshift是一个非常轻量级的算法。我不确定它是否真的相关,但你在第二篇文章中得到了一个好主意:最小化搜索区域......

  • 侧面想法对我来说似乎很好,你可以尝试检测运动(例如全局运动),如果没有那么多,那么不要再试图再次检测你已经检测到的......你可以尝试使用动作模板,因为您知道来自平移或面部检测的silouhette ... 一个非常简单,轻巧但不健壮的模板与框架n-1和框架n匹配可以给你一个系数来测量这两个框架之间的一种相似性,你可以说,低于某个阈值,你激活面部检测。 ... 为什么不 ?如果C#包装器具有matchTemplate()等效函数,则需要5分钟才能实现...

如果我有更好的(更深层次的)想法,我会回到这里,但就目前而言,我刚从工作中回来,很难想得更多......

于连

答案 1 :(得分:2)

您介绍的所有解决方案似乎都很聪明,也很合理。但是,如果您使用Haar进行面部检测,您可能会尝试创建一个阶段较少的级联。虽然建议将20个阶段用于人脸检测,但10-15个可能就足够了。这将显着提高性能。有关创建自己级联的信息,请访问Tutorial: OpenCV haartraining (Rapid Object Detection With A Cascade of Boosted Classifiers Based on Haar-like Features)

同样,使用SURF是一个好主意。您也可以尝试P-N learning: Bootstrapping binary classifiers by structural constraints。 YouTube上有一些有趣的视频展示了这种方法,试着找到它们。

答案 2 :(得分:0)

这不是一个完美的答案,只是一个建议。

在我在CS的B.Tech的最后一个学期的数字图像处理课程中,我学习了位置切片,以及只有MSB平面信息的图像如何提供近70%的有用图像信息。因此,您将使用几乎原始图像,但只有原始图像的八分之一。

所以虽然我没有在我自己的项目中实现它,但我想知道它,以加快面部检测。因为以后,眼睛检测,瞳孔和眼角检测也会占用大量的计算时间,使整个程序变慢。