使用android sdk而不是opencv的人脸识别

Posted

技术标签:

【中文标题】使用android sdk而不是opencv的人脸识别【英文标题】:Face recognition using android sdk not 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 常量吗?以什么方式?我想我会用这些方法来做人脸识别,但是我不知道怎么用。

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

【问题讨论】:

投反对票的人可以留下反馈吗?以便我可以改进问题。 你使用这个链接,可能对你有帮助。 edumobile.org/android/android-programming-tutorials/… 【参考方案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 你有这个的演示吗?

以上是关于使用android sdk而不是opencv的人脸识别的主要内容,如果未能解决你的问题,请参考以下文章

android OpenCV研究之动态人脸识别

android OpenCV研究之动态人脸识别

Android OpenCV实现人脸检测完成人脸检测功能

使用 OpenCV 检测指尖而不是人脸

使用 Android 进行 OpenCV 人脸识别

Android Studio配置及使用OpenCV