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

标签 java opencv face-detection haar-classifier eye-detection

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

到目前为止我做了什么:

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

我面临的问题:

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

主要问题:

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

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

  3. Haar-Cascades灰度 图像中的效果更好吗?

  4. 不同的光照条件会产生不同吗?

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

  6. 如果我想进一步分析眨眼闭眼持续时间打哈欠头部使用支持 vector 机点头头部方向来检测疲劳(困倦),有什么建议吗?

感谢您的帮助!

最佳答案

以下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 颜色。检测主要取决于输入图像中的梯度/特征。因此,只要输入图像中有足够的梯度差异,例如眉毛的强度低于额头等,它就可以正常工作。

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

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 个不同的级联来得出当前面部状态的速度非常慢,但是我建议您使用一些面部地标检测框架,例如 Dlib ,你也可以搜索一些其他框架,因为dlib的模型大小将近100MB,如果你想将它移植到移动设备上,它可能不适合你的需求。所以关键是 ** 面部地标检测 **,一旦你得到完整的面部标记,你就可以得出结论,比如嘴巴是否张开或眼睛是否眨眼,它是实时工作的,所以你的视频处理不会'不要受太多苦。

关于java - 使用 OpenCV Haar 级联进行面部特征检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42847888/

相关文章:

iOS,人脸检测,检测远离人脸的位置

java - 面向多数据库 Java/hibernate 开发人员的廉价/免费查询工具

java - OSX Eclipse : No Java virtual machine was found after searching the following locations

python - 录像逻辑错误-fps

c++ - OpenCV haarcascade_frontalface 检测区域

iphone - CIFaceFeature 的坐标系

java - 使用 JDBC 从 MySQL 数据库中提取数据时如何避免丢失标点符号?

java - 如何获取数组中的输出值以进一步处理输出

python - Tesseract OCR 无法检测到不同的字体大小和未水平对齐的字母

xcode - 编译错误Xcode 4.3.1-> OpenCv Framework