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

Mat*_*oli 5 c# opencv computer-vision face-detection emgucv

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

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

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

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

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

你有什么建议吗?

谢谢.

jma*_*tel 3

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

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

  • 侧面的想法对我来说似乎很好,你可以尝试检测运动(例如全局运动),如果没有那么多,那么就不要尝试再次检测你已经检测到的东西......你可以尝试用运动来做到这一点模板,如您所知道的来自均值漂移或人脸检测的轮廓...与帧 n-1 和帧 n 匹配的非常简单、轻量级但不鲁棒的模板还可以为您提供一个系数,用于衡量这两个帧之间的相似性,你可以说低于某个阈值你就会激活面部检测......为什么不呢?如果 C# 包装器具有 matchTemplate() 等效函数,则需要 5 分钟才能实现...

如果我有更好(更深入)的想法,我会回到这里,但现在,我刚刚下班回来,很难思考更多......

朱利安,