我正在开发一个应用程序,需要在视频流中检测人脸的位置,使用的是放置在桌面高度(并略微偏离用户一侧)的网络摄像头。
我已经实现了OpenCV的一个版本(使用他们的Haar检测),效果还可以……问题是如果用户将头转向一侧(或向上看),它往往会丢失人脸的位置。
由于网络摄像头放在桌面上,它以30度角向上倾斜。OpenCV的检测算法是使用完全正面的图像进行训练的,而不是像我使用的这种向上角度的图像。我知道OpenCV也有一个可以使用的侧面Haar文件……但根据我的研究,侧面检测的结果似乎相当参差不齐。此外,我无法控制图像的背景或照明……所以这有时也会影响OpenCV检测算法的效果。
所以,我想问的是……有没有其他的人脸检测算法(希望是免费的,因为这是我大学研究的一部分),更适合这种设置下的人脸检测?看起来一些内置的网络摄像头(适用于Mac和PC)实际上拥有相当强大的算法来检测人脸(然后在人脸上覆盖一些俗气的卡通图像)……但它们似乎不受背景或照明的影响。你有什么推荐吗?谢谢。
回答:
为了研究目的,你可以使用OpenCV中的Haar级联,如果你想商业化使用(在这种情况下,你需要考虑使用LBP级联)。请务必在你的参考文献中引用Viola-Jones论文。
为了改善人脸检测的结果,你有几条路径可选:
- 单张图像检测:你可以将旋转后的图像发送到正面级联,以应对一些变异,而无需训练自己的级联
- 单张图像检测(但工作量更大):在更接近你的应用程序操作条件下训练自己的级联
- 视频流中的稳定性(如网络摄像头等):这可以通过在人脸检测周围添加一层跟踪来实现。根据你对这个主题的了解,你可以使用自己的滤波器,尝试OpenCV的粒子或卡尔曼滤波器,在人脸位置上实现简单的第一或第二阶低通滤波器,或者在检测到的人脸上实现PID跟踪器……
这些跟踪滤波器中的任何一个在处理视频流时都会大大提升你的结果。