Распознавание лиц с использованием 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
класс не делает то, что вы думаете, что он делает. В частности, он не распознает лица, а распознает лица (отсюда и название класса).
Он анализирует изображение и возвращает Face
S найдено на изображении. Это не делает различий между Face
s (вы не можете сказать, если это Джон Face
или Сара Face
) кроме расстояния между глазами - но это не совсем подходящая точка сравнения. Он просто дает вам обнаруженные лица и уровень уверенности, что найденные объекты на самом деле Face
s.
Пример:
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/