Android - 人脸特征检测

时间:2012-03-20 09:10:53

标签: android opencv computer-vision face-detection feature-detection

目前我正在开发适用于Android手机的应用。我们想要检测脸部的特征。该程序应该能够检测到眼睛,鼻子,嘴巴和脸部边缘的位置。

准确性应该没问题,但不一定要完美。可以放松一些准确性以加快速度。所有的面都是正面的,我们之前会知道这些特征的大致位置。我们不需要实时检测。应从保存的图像中提取要素。检测时间应该只要不影响用户体验。所以即使2或3秒也可以。

有了这个假设,找到一个能让我们实现这个目标的库不应该太难。但我的问题是,最好的方法是什么?你的建议是什么?这是我第一次为Android开发,我不想跑错方向。对我们来说一个库是个好主意还是我自己实现一些现有算法更好(更快/更高准确度)?

我google了很多,我发现了很多有趣的东西。 Android API中还有面部检测功能。但是返回的面部类(http://developer.android.com/reference/android/media/FaceDetector.Face.html)仅包含眼睛的位置。这对我们的应用来说更少。然后还有适用于Android或JavaCV的OpenCV。您认为合作的好主意是什么?对于哪个库有好的文档,教程?

5 个答案:

答案 0 :(得分:8)

OpenCV有a tutorial for this purpose,遗憾的是只有C ++,因此您必须将其转换为Android。

如果要检测来自drawable或SD卡图像的图像,您还可以在Android中尝试使用FaceDetection API this is a simple example。或者与摄像机图像一起使用的最新Camera.Face API

如果您希望动态时的相机图像比首次阅读How to take picture from camera.,但我建议您查看官方OpenCV Android样本并使用它们。

<强>更新

Mad Hatter示例使用Camera with SurfaceView的方法。它很有希望。看看Mad Hatter

如果链接出现故障,相关代码是:

public class FaceDetectionListener implements Camera.FaceDetectionListener {
    @Override
    public final void onFaceDetection(Face[] faces, Camera camera) {
        if (faces.length > 0) {
            for (Face face : faces) {
                if (face != null) {
                    // do something
                }
            }
        }
    }
}

答案 1 :(得分:4)

我正在开展一个类似的项目。我使用FaceDetection API进行了一些测试,可以告诉你,如果你想检测眼睛,鼻子,嘴巴和边缘,它不会帮助你。此API仅允许您检测眼睛。如果你想实现面部识别是没用的,因为在面部检测部分你需要的功能不仅仅是眼睛。

对您的第一个回复发表评论:您确实需要进行面部检测。查找要素是人脸检测的一部分,获取这些功能是人脸识别应用程序的第一步。使用OpenCV,您可以使用 Haar-like功能来获取这些功能(眼睛,鼻子,嘴巴等)。

但是我发现将openCV函数与单独的.cpp文件一起使用有点复杂。有一个名为JNIEXPORT的东西,它允许您在.cpp文件中编辑带有OpenCV函数的Android图库图像。 OpenCV有一个类似Haar的特征检测.cpp文件,可以用于人脸检测(和其他算法的第二步识别)。

您是在Windows或Linux上开发的吗?我正在使用Windows并且没有设法使用您链接的教程来设置OpenCV。但是我在Eclipse中有一个工作的Windows OpenCV环境,并且从OpenCV 2.3.1开始工作。也许我们可以互相帮助并分享一些信息/结果?请告诉我。

答案 2 :(得分:2)

我找到了一个很好的解决方案,可以解决这个Microsoft API提供的面部情感检测。此API返回JSON响应和情感图。您可以尝试使用此API以获得良好的结果。

  

Emotion API

     

情感识别 识别图像中一个或多个人表达的情感,并返回一个边框。   面对。检测到的情绪是快乐,悲伤,惊讶,愤怒,   恐惧,蔑视,厌恶或中立。

     
      
  • 支持的输入图像格式包括JPEG,PNG,GIF(第一帧),BMP。图像文件大小不应大于4MB。
  •   
  • 如果用户已调用Face API,则可以将面部矩形作为可选输入提交。否则,Emotion API将首先出现   计算矩形。
  •   
  • 可检测的脸部尺寸范围为36x36至4096x4096像素。超出此范围的面将无法检测到。
  •   
  • 对于每个图像,检测到的最大面部数量为64,并且面部按面部矩形大小按降序排列。如果不   检测到face,将返回一个空数组。
  •   
  • 由于技术挑战,可能无法检测到某些面部,例如:非常大的面角(头部姿势),大的咬合。正面和   近前脸有最好的效果。 - 情绪蔑视和   厌恶是实验性的。
  •   

https://www.microsoft.com/cognitive-services/en-us/emotion-api

答案 3 :(得分:0)

这是一个很好的查询。我想如果你得到眼睛的特征点,那么我们也可以通过知道眼睛中其他点的估计距离来计算其他点。

请参阅此文章,详细了解我想说的内容:http://klucv2.googlecode.com/svn/trunk/docs/detection%20of%20facial%20feature%20points%20using%20anthropometric%20face%20model.pdf

我希望这会有所帮助。

答案 4 :(得分:0)

看看新的Android face API,其中包括面部地标检测。这里有一个教程:

https://developers.google.com/vision/detect-faces-tutorial