安卓 - 人脸特征检测

14

我目前正在开发一款安卓手机应用程序,需要检测人脸的特征。该程序应能够检测眼睛、鼻子、嘴巴和脸部边缘的位置。精确度应该足够,但不需要完美。为了提高速度,可以牺牲一些准确性。所有人脸都将是正面的,并且我们在之前已经知道了特征的大致位置。我们不需要实时检测,特征应从保存的图像中提取。检测时间应该尽可能短,以免影响用户体验。因此,甚至2或3秒也可以接受。

在这些假设下,找到一个使我们能够实现这一点的库不应该太难。但我的问题是,什么是最好的方法?你有什么建议?这是我第一次开发安卓应用程序,我不想走错方向。使用库是个好主意还是更好(更快/更准确)地自行实现一些现有算法?

我搜索了很多东西,找到了很多有趣的东西。Android API中也有人脸检测。但返回的人脸类(http://developer.android.com/reference/android/media/FaceDetector.Face.html)只包含眼睛的位置。这对我们的应用程序来说是不够的。然后还有OpenCV for Android 或 JavaCV。你认为使用哪个库是个好主意?哪个库有好的文档、教程?


1
请问您在研究中有什么进展了吗?我也在尝试做类似的事情。请告诉我! - Lisa Anne
5个回答

8

OpenCV有一个针对此目的的教程,不幸的是它只支持C++,所以您需要将其转换为Android。

您还可以尝试在Android中使用FaceDetection API,这是一个简单的例子,如果您正在检测来自drawable或sdcard图像的图像。或者最近的Camera.Face API,它可以与相机图像一起使用。

如果您希望在动态时间从相机获取图像,则首先阅读如何从相机拍照,但我建议您检查官方的OpenCV Android示例并使用它们。

更新:

Mad Hatter示例使用了具有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
                }
            }
        }
    }
}

谢谢您的快速回复。实际上我不需要面部检测。我要处理的图像只包含人脸。最重要的部分是找到特征。眼睛、鼻子、嘴巴在哪里,脸的边缘在哪里(背景从哪里开始,头发从哪里开始)。我只需要将其应用于存储的图像,而不是实时应用于相机。您知道一个好的介绍吗?也许是OpenCV或其他算法? - tschoartschi
1
FaceDetection API可以根据眼睛之间的距离和其他特征检测人脸。因此,请尝试探索一下。如果没有找到任何运气,那么可以考虑使用OpenCV。 - Tofeeq Ahmad
我在文档中看到了那个。但是我想知道如果我知道眼睛的位置,是否真的更容易提取其他特征。Android 4还为嘴巴提供了坐标。所以我正在寻找类似于那样的东西。 - tschoartschi
抱歉分成了两个评论,但是我用我的“智能”手机无法按编辑按钮:-D 因为我认为在图像中检测特征并不是一件简单的事情。在我的学习过程中,我听到了一些关于这个主题的理论知识,但我从未在实际场景中应用过。如果我自己实现所有东西,我担心我正在尝试重新发明轮子。而且我相信我的版本不会完美,因为时间限制和缺乏知识的原因。 - tschoartschi
是的,独自工作会是一项耗时的任务。尝试使用一些API。 - Tofeeq Ahmad
显示剩余2条评论

4

我正在做一个类似的项目。我使用了FaceDetection API进行了一些测试,可以告诉你,如果你想检测眼睛、鼻子、嘴和边缘,它将无法帮助你。该API只允许你检测眼睛。如果你想实现面部识别,那么它是无用的,因为在面部检测过程中,你需要比眼睛更多的特征。

关于你第一次回复的评论:实际上,你确实需要面部检测。找到特征是面部检测的一部分,获取这些特征是面部识别应用程序的第一步。使用OpenCV,你可以使用Haar-like特征获取这些特征(眼睛、鼻子、嘴巴等)。

然而,我发现使用单独的.cpp文件和OpenCV函数有点复杂。有一种叫做JNIEXPORT的东西,它允许你在.cpp文件中使用OpenCV函数编辑Android图库图像。OpenCV有一个示例Haar-like特征检测.cpp文件,可以用于人脸检测(并使用其他算法作为第二步进行识别)。

你是在Windows还是Linux上开发?我正在使用Windows,但没有成功使用你链接的教程设置OpenCV。不过我在Eclipse中有一个可用的Windows OpenCV环境,并让OpenCV 2.3.1的所有示例都能正常运行。也许我们可以互相帮助、分享一些信息和结果?请告诉我。


对于FaceDetection API,它似乎只能检测到眼睛的中心和它们之间的距离,但是否可能获取到单个眼睛?或者是否可能知道脸部是倾斜的? - Lim Thye Chean

2
我已经找到了一个很好的面部情感检测解决方案,它由微软API提供。这个API返回一个JSON响应和情感图表。你可以尝试使用这个API来获得良好的结果。
情感API
情感识别:识别图像中一个或多个人表达的情感,并返回面部边界框。检测到的情感有快乐、悲伤、惊讶、愤怒、恐惧、轻蔑和厌恶或中性。
支持的输入图像格式包括JPEG、PNG、GIF(第一帧)、BMP。图像文件大小不应超过4MB。
如果用户已经调用了Face API,则可以将人脸矩形作为可选输入提交。否则,情感API会首先计算矩形。
可检测的面部大小范围为36x36至4096x4096像素。超出此范围的面部将无法检测。
对于每个图像,最多可以检测64个面部,并按面部矩形大小降序排列。如果未检测到面部,则将返回空数组。
由于技术挑战,例如非常大的面部角度(头部姿势)、大面积遮挡等原因,可能无法检测到某些面部。正面和近正面的面部效果最好。-轻蔑和厌恶是实验性的情感。

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


0

0

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