使用 OpenCV Haar 级联进行面部特征检测

Face Features Detection Using OpenCV Haar-cascades

我正在使用 JavaOpenCV 库来检测 FaceEyesMouth 使用 Laptop Camera.

到目前为止我做了什么:

  1. 使用 VideoCapture 对象捕获视频帧。
  2. 使用Haar-Cascades检测Face
  3. Face区域划分为Top区域和Bottom区域。
  4. Top 区域内搜索 Eyes
  5. Bottom 区域内搜索 Mouth

我面临的问题:

主要问题:

  1. Haar-Cascades 的相机分辨率越高越好吗?

  2. 我是否必须以特定比例捕获视频帧?例如 (100px X100px)?

  3. Haar-CascadesGray-scale 图像中效果更好吗?

  4. 不同的光照条件有区别吗?

  5. 方法detectMultiScale(params)到底做了什么?

  6. 如果我想进一步分析Eye BlinkingEye Closure DurationMouth YawningHead NoddingHead Orientation来检测疲劳(嗜睡)使用 Support Vector Machine,有什么建议吗?

感谢您的帮助!

以下 article 将向您概述幕后发生的事情,我强烈建议您阅读这篇文章。

Do Higher Cameras' Resolutions work better for Haar-Cascades?

不一定,cascade.detectMultiScale有参数来调整各种输入宽度,高度场景,比如minSizemaxSize,这些是可选参数但是,但是你可以调整这些如果您可以控制输入图像的大小,则可以获得可靠的预测。如果您将 minSize 设置为较小的值并忽略 maxSize 那么它也适用于较小和高分辨率的图像,但性能会受到影响。另外,如果您现在想象一下,为什么高分辨率和低分辨率图像之间没有区别,那么您应该考虑 cascade.detectMultiScale 在内部将图像缩放到较低的分辨率以提高性能,这就是定义 maxSizeminSize 对于避免任何不必要的迭代很重要。

Do I have to capture Video Frames in a certain scale? for example (100px X100px)

这主要取决于您传递给 cascade.detectMultiScale 的参数。我个人认为 100 x 100 对于框架中较小的人脸检测来说太小了,因为在将框架调整为较小尺寸时某些特征会完全丢失,并且 cascade.detectMultiScale 高度依赖于梯度或特征在输入图像中。

但是如果输入框只有人脸作为主要部分,并且没有其他较小的人脸悬在后面,那么您可以使用100 X 100。我测试了一些大小为 100 x 100 的样本面,效果很好。如果不是这种情况,那么 300 - 400 像素宽度应该可以正常工作。但是,您需要调整参数以达到准确性。

Do Haar-Cascades work better in Gray-scale Images?

它们仅适用于灰度图像。

article中,如果你看了第一部分,你就会知道它的人脸检测是由检测图像中的许多二进制模式组成的,这基本上来自 ViolaJones,该算法的基础论文

Does different lighting conditions make difference?

可能在某些情况下,主要是 Haar 特征是光照不变的。

如果您正在考虑不同的照明条件作为在绿光或红光下拍摄图像,那么它可能不会影响检测,haar 特征(因为依赖于灰度) 与输入图像的 RGB 颜色无关。检测主要依赖于输入图像中的gradients/features。所以只要输入图像中有足够的梯度差异,例如眉毛的强度低于额头等,它就可以正常工作。

但考虑输入图像有背光或环境光非常低的情况,在这种情况下,可能找不到一些突出的特征,这可能导致无法检测到人脸。

What does the method detectMultiScale(params) exactly do?

我想,如果你现在已经阅读了 article,那你一定已经很了解了。

If I want to go for further analysis for Eye Blinking, Eye Closure Duration, Mouth Yawning, Head Nodding and Head Orientation to Detect Fatigue (Drowsiness) By Using Support Vector Machine, any advices?

不,我不建议您使用 SVM 执行这些类型的手势检测,因为 运行 10 个不同的级联来总结当前面部状态会非常慢,但是我建议您使用一些Facial Landmark Detection Framework,比如Dlib,你也可以搜索一些其他框架,因为dlib的模型大小将近100MB,如果你想将它移植到移动设备上,它可能不适合你的需求.所以关键是 ** 面部地标检测 **,一旦你得到完整的面部标记,你就可以得出结论,比如嘴巴是否张开或眼睛是否眨眼,它是实时工作的,所以你的视频处理不会'受不了多少。