Распознавание лиц с использованием Android SDK не OpenCV

В настоящее время я работаю над распознаванием лиц в Android. Я провел достаточно времени в интернете и нашел класс FaceDetector.Face в Android. И это утилиты этого класса:

 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)

Проблема в том, что я не знаю, как использовать эти методы, и я не могу найти учебник или пример исходного кода для этого. Вопрос в том, должен ли я использовать eyesDistance() для различения людей? Например, у Сары расстояние глаз = 6,51 см, у Джона = 6,82. Когда код вычисляет расстояние между глазами человека и когда оно составляет 6,82, говорит ли оно вам, что "это Джон", это способ идентификации людей? Или каков алгоритм для этого? Или я должен использовать константы EULER? В каком смысле? Я думаю, что я собираюсь использовать эти методы для распознавания лиц, но я не знаю, как его использовать.

Или вы можете предложить другое решение для распознавания лиц? Любая помощь будет оценена.

3 ответа

Решение

FaceDetector класс не делает то, что вы думаете, что он делает. В частности, он не распознает лица, а распознает лица (отсюда и название класса).

Пример обнаружения лица

Он анализирует изображение и возвращает FaceS найдено на изображении. Это не делает различий между Faces (вы не можете сказать, если это Джон Face или Сара 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
}

Как сказал Тушар, FaceDetector обнаруживает только лица. Вы не можете узнать их, используя FaceDetector, хотя. Вывод расстояния до глаз измеряется в пикселях, а не в сантиметрах или дюймах. Представляет, насколько велико лицо внутри растрового изображения. Предполагается, что углы Эйлера представляют трехмерное вращение головы. Однако, если ваше приложение использует какой-либо API до 14, значения углов Эйлера всегда будут равны 0,0 (они не вычисляются). Итак, позаботься об этом.

Если вы хотите распознать лицо, вы можете использовать opencv. Я не использовал это сам, но я думаю, что это доступно на Android. Распознавание лиц в 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

Удачи!

Вы используете эту ссылку, может быть полезно для вас. http://www.edumobile.org/android/android-programming-tutorials/face-detection-example-tutorials-in-android/

Другие вопросы по тегам