【问题标题】:Face recognition using android sdk not opencv使用android sdk而不是opencv的人脸识别
【发布时间】:2013-03-09 17:58:44
【问题描述】:

我目前正在研究 android 中的人脸识别。我在互联网上花费了合理的时间,并在 Android 中找到了 FaceDetector.Face 类。这些是这个类的实用程序:

 Constants
 float  CONFIDENCE_THRESHOLD
 int    EULER_X The x-axis Euler angle of a face.
 int    EULER_Y The y-axis Euler angle of a face.
 int    EULER_Z The z-axis Euler angle of a face.

 Public Methods
 float   confidence()
 float   eyesDistance()
 void    getMidPoint(PointF point)
 float   pose(int euler)

问题是,我不知道如何使用这些方法,也找不到任何教程或示例源代码。问题是,我应该使用 eyeDistance() 来区分人们吗?例如,莎拉的眼睛距离是 = 6.51 厘米,而约翰的眼睛距离是 = 6.82。当代码计算一个人的眼睛距离并且它是6.82时,它是否告诉你“它是约翰”这是识别人的方式吗?或者它的算法是什么?或者我应该使用 EULER 常量吗?以什么方式?我想我会用这些方法来做人脸识别,但是我不知道怎么用。

或者您能推荐另一种人脸识别解决方案吗? 任何帮助将不胜感激。

【问题讨论】:

标签: android face-recognition


【解决方案1】:

正如 Tushar 所说,FaceDetector 只检测人脸。但是,您无法使用 FaceDetector 识别它们。眼距输出以像素为单位,而不是厘米或英寸。它表示人脸在位图图像中的大小。欧拉角应该代表头部的 3D 旋转。但是,如果您的应用程序使用 14 之前的任何 api,则欧拉角值将始终为 0.0(不计算它们)。所以,请注意这一点。

如果你想做人脸识别,可以使用opencv。我自己没有使用过,但我认为它可以在 Android 上使用。 Face Recognition in OpenCV http://docs.opencv.org/trunk/modules/contrib/doc/facerec/

如果您不想或不能将 OpenCV 添加到您的项目中,您可以自己编程人脸识别。这需要一些时间,但并不难。您可以实现一些特征脸的变体:http://www.youtube.com/watch?v=LYgBqJorF44&list=PLd3hlSJsX_Imk_BPmB_H3AQjFKZS9XgZm&index=16

祝你好运!

【讨论】:

    【解决方案2】:

    FaceDetector 类并没有像你想象的那样做。具体来说,它不做面部识别,而是面部检测(因此是类名)。

    它分析图像并返回在图像中找到的Faces。除了他们眼睛之间的距离之外,Faces(你无法分辨是 John 的 Face 还是 Sarah 的 Face)之间没有区别——但这并不是一个真正有效的比较点。它只是为您提供找到的面孔以及找到的对象实际上是Faces 的置信度。

    例如:

    int maxNumFaces = 2; // Set this to whatever you want
    FaceDetector fd = new FaceDetector(imageWidth,imageHeight,maxNumFaces);
    Faces[] faces = new Faces[maxNumFaces];
    
    try {
      int numFacesFound = fd.findFaces(image, faces);
    
      for (int i = 0; i < maxNumFaces; ++i) {
         Face face = faces[i];
         Log.d("Face " + i + " found with " + face.confidence() + " confidence!");
         Log.d("Face " + i + " eye distance " + face.eyesDistance());
         Log.d("Face " + i + " pose " + face.pose());
         Log.d("Face " + i + " midpoint (between eyes) " + face.getMidPoint());
      }
    } catch (IllegalArgumentException e) {
      // From Docs:
      // if the Bitmap dimensions don't match the dimensions defined at initialization 
      // or the given array is not sized equal to the maxFaces value defined at 
      // initialization
    }
    

    【讨论】:

    • 感谢您的回复。我想也许有一个公式,我们使用 EULER 或 eyeDistance 来识别一个人。你有什么解决方案可以建议我解决这个问题吗?
    • @aysealmac 我不认为您可以仅使用姿势和眼睛之间的距离来唯一识别面部,但我也不是面部识别之间的科学专家。
    • Tushar 你有这个的演示吗?
    猜你喜欢
    • 2018-09-15
    • 2018-11-25
    • 2021-03-01
    • 2012-06-15
    • 2015-07-05
    • 2016-09-18
    • 2013-08-13
    • 2019-08-10
    • 2011-02-20
    相关资源
    最近更新 更多