4

我正在使用Java库来OpenCV检测Face和使用.EyesMouthLaptop Camera

到目前为止我做了什么:

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

我面临的问题:

  • 起初视频运行正常,突然变慢。

主要问题:

  1. 更高的相机分辨率是否更适合 Haar-Cascades?

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

  3. Haar-CascadesGray-scale图像中工作得更好吗?

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

  5. 该方法的具体作用detectMultiScale(params)是什么?

  6. 如果我想进一步分析Eye Blinking, Eye Closure Duration, Mouth Yawning,Head NoddingHead OrientationDetect Fatigue (Drowsiness) By Using Support Vector Machine,有什么建议吗?

感谢您的帮助!

4

1 回答 1

4

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

更高的相机分辨率是否更适合 Haar-Cascades?

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

我是否必须以一定比例捕获视频帧?例如(100 像素 X100 像素)

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

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

Haar-Cascades 在灰度图像中效果更好吗?

它们仅适用于灰度图像。

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

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

可能在某些情况下,大部分 Haar 特征是光照不变的。

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

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

方法 detectMultiScale(params) 究竟做了什么?

我想,如果你已经阅读了article, 到这个时候,那么你一定很了解它。

如果我想通过使用支持向量机进一步分析眨眼、闭眼持续时间、嘴巴打哈欠、点头和头部方向以检测疲劳(嗜睡),有什么建议吗?

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

于 2017-03-18T04:10:47.753 回答