使用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
类并没有像你想象的那样做。具体来说,它不做面部识别,而是面部检测(因此是类名)。
它分析图像并返回在图像中找到的Face
s。除了他们眼睛之间的距离之外,Face
s(你无法分辨是 John 的 Face
还是 Sarah 的 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
【讨论】:
感谢您的回复。我想也许有一个公式,我们使用 EULER 或 eyeDistance 来识别一个人。你有什么解决方案可以建议我解决这个问题吗? @aysealmac 我不认为您可以仅使用姿势和眼睛之间的距离来唯一识别面部,但我也不是面部识别之间的科学专家。 Tushar 你有这个的演示吗?以上是关于使用android sdk而不是opencv的人脸识别的主要内容,如果未能解决你的问题,请参考以下文章