如何使用Open CV检测打哈欠?

10

我正在为iOS开发一个应用程序,需要检测用户打哈欠的动作。

我的做法是使用OpenCV并使用haar级联来检测脸部,然后在脸部内部寻找嘴巴(同样使用haar级联)。

我遇到的问题是,我以为只需要像(face.y - mouth.y) < something = yawn这样简单地检测一下就能成功。但实际上,面部和嘴巴的矩形框“不稳定”,也就是说,每次循环运行时,面部和嘴巴的X和Y值都会(显然)发生变化。

有没有“张嘴”haar级联可以使用,或者如何知道何时用户张嘴?


这可以被视为面部表情识别的一个例子,这通常使用SVM完成。因此,在这条路线上进行谷歌搜索可能会为您提供一些很好的结果。 - Abid Rahman K
1
如果用户在打哈欠时捂住嘴巴,会怎么样? - user377628
2
@Hassan 也给他们来一次电击吧! :) - kenny
检测一个人打哈欠的声音怎么样?在嘈杂的环境中可能非常困难。 - kenny
2个回答

11

通常,支持向量机(SVM)用于面部表情识别,例如愤怒、微笑、惊讶等,仍在积极发展中。谷歌搜索可以给您提供很多关于这个话题的论文(甚至我的一位同学就把它作为他的毕业项目)。因此,首先您需要训练SVM,为此,您需要样本图片,包括打哈欠和正常脸部。

打哈欠与惊喜几乎相似,口部在两种情况下都会张开。我建议您查看以下论文的第3页:Real Time Facial Expression Recognition in Video using Support Vector Machines(如果您无法访问该链接,请通过论文名称进行谷歌搜索)。

该论文(甚至我的同学)使用面部特征的位移向量。为此,您需要在脸上找到一些特征点。例如,在论文中,他们使用了瞳孔、眼睑的极值点、鼻尖、嘴巴区域的极值点(嘴唇)等。然后,他们不断跟踪这些特征的位置,并计算它们之间的欧几里得距离。这些数据被用于训练SVM。

请查看以下两篇论文:

从脸部提取特征点

基于Gabor特征的增强分类器全自动面部特征点检测

看下面的图像,它展示了脸部特征点的意思:

enter image description here

在你的情况下,我想你是在iPhone上实时实现它。因此,你可以避免眼睛处的特征点(虽然这不是一个好主意,因为当你打哈欠时,眼睛会变小)。但与此相比,嘴唇处的特征点显示出更多的变化和显著性。因此,仅在嘴唇上实现可能会节省时间。(当然,这取决于你自己)。

嘴唇分割:已经在SOF中讨论过,查看这个问题:OpenCV Lip Segmentation

最后,我相信你可以在谷歌上找到很多细节,因为这是一个活跃的开发领域,有很多论文可供参考。

另一种选择

在这个领域的另一个选择是我听说过好几次的主动外观模型。但我对它一无所知。你可以自己谷歌一下。


这些概念离我很遥远 :) 但是我用haar级联的方式解决了这个问题:首先搜索脸部,然后在脸部内搜索嘴巴。当嘴唇没有张开时,就找到了嘴巴。所以如果我找到了一个嘴巴,但之后再也找不到嘴巴了,我就假设用户打哈欠了。虽然不完美,甚至不太好看,但它解决了我开发应用程序所需的问题。 - iVela
我所提到的方法并不遥远。这是我在本科时由我的朋友在Matlab中完成的。而且所有的函数都是在OpenCV中实现的。没问题,你可以自己选择。只是指出了这种方法。祝你好运。 - Abid Rahman K
谢谢@Abid,问题是我对SVM和OpenCV都没有任何想法,只知道基础:D但这真的很有趣,所以在这个项目之后,我会研究一下,以使其实现“好”。此外,这种知识还具有多种用途,例如增强现实,并且可以在几乎所有地方使用OpenCV(Android、iOS、桌面等)。因此,将来我会更多地研究你告诉我的方法。再次感谢! - iVela
我一直在寻找相同的解决方案,即iOS面部表情识别库。是否有一个样本SVM程序/Github可以在iOS上进一步使用? - Stella

0

OpenCV还具有面部识别/检测功能(请参阅openCV SDK附带的示例)。我认为这些将是更好的查找位置,因为haar级联不会真正分析您需要的面部表情。尝试运行示例并自行查看-您将获得有关检测到的眼睛/嘴巴的实时数据。

祝你好运


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接