如何在非相机应用程序中使用Android相机API?

11

我想在一个非相机应用程序中使用一些Android 4 API。

这些API包括一些非常好的面部检测类,其中包括自API 14以来可用的Camera.Face类。我想应用相同的面部检测类来实现设备上保存的图像的人脸检测。我更喜欢使用它来处理存储在设备本身上的图片(例如:社交标记,人脸图像操作等)。

我需要指导如何完成此重用任务。

3个回答

6
如果您需要在设备上存储的图像中检测人脸,则无需对Android源代码进行黑客攻击即可完成此操作!自API 1以来,FaceDetector API就可以在android.media包下使用,它接受Bitmap作为输入(以565格式呈现),并提供该图片中人脸的位置。以下是您需要执行的步骤:
1- 加载Bitmap并将其转换为565格式(假设您的drawable资源中有facesPicture文件)。
Bitmap originalBitmap = 
            BitmapFactory.decodeResource(getResources(),R.drawable.facesPicture);

Bitmap bitmap = originalBitmap .copy(Bitmap.Config.RGB_565, true);

originalBitmap .recycle(); // allow the GC to collect this object

2- 定义Face数组以保存检测到的人脸信息,并初始化FaceDetector

int MAX_FACES = 20; // assuming that the image will have maximum 20 faces

FaceDetector.Face[] faces = new FaceDetector.Face[MAX_FACES];

FaceDetector faceDetector = 
             new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), MAX_FACES);

3- 搜索面孔并处理结果

int facesCount = faceDetector.findFaces(bitmap, faces);

for(int i=0; i<facesCount; i++) {
    FaceDetector.Face face = faces[i];

    float detectionConfidence = face.confidence(); // over 0.3 is OK

    PointF eyesMidPoint = new PointF();

    face.getMidPoint(eyesMidPoint);

    float eyesDistance = face.eyesDistance();

    float rotationX = face.pose(FaceDetector.Face.EULER_X);

    float rotationY = face.pose(FaceDetector.Face.EULER_Y);

    float rotationZ = face.pose(FaceDetector.Face.EULER_Z);

    // Do something with these values

}

你可以在这里下载一个完整的项目示例,该示例在文章使用Android API进行人脸检测中有详细说明。
如果您想要更高级的功能,可以考虑使用OpenCV。

谢谢!但正如您在上面的评论中所看到的,我正在研究检测鼻子和嘴巴,而FaceDetector无法提供此功能。 - Lisa Anne
1
你可以使用 OpenCV,或者尝试实现一个鼻子和嘴巴检测算法,因为你已经知道了眼睛的位置。你可以查看OpenCV的代码来获取灵感。 - iTech
确实,那是我目前正在做的事情。谢谢! - Lisa Anne

3
FaceDetectionListener是用于检测人脸的监听器,但它只能在相机上监听。这是它唯一的本地功能。如果你真的想在用户设备上使用它来处理图片,我建议你下载相机API的源代码,并根据你的需求调整所需的方法。
你可以在这里找到所有原生Android代码的源码: https://android.googlesource.com/ 祝好运!

谢谢,但我实际上找不到相机API的源代码(我已经搜索了)。如有任何帮助,将不胜感激。 - Lisa Anne
试着查看这里的代码:https://android.googlesource.com/platform/packages/apps/Camera/+/master 如果那里没有,很可能会在硬件框架中。让我知道进展如何。 - NathanTempelman
实际上,http://code.google.com/a/eclipselabs.org/p/face-recognition-android/source/browse/ 里面并没有任何内容。不过还是谢谢。 - Lisa Anne
其他两个链接呢? - NathanTempelman
嗨Nathan,谢谢,到目前为止我在其他链接上没有成功。可能是我在错误的地方寻找。 - Lisa Anne
既然它是内置在Android源代码中的,如果你真的想找到它,你可以尝试从Github或Google Code拉取整个Android源代码库,并在整个项目中搜索FaceDetection。这需要一些工作,但你肯定会找到它的。 - NathanTempelman

2

谢谢!我了解FaceDetector类,但正如你可能知道的那样,它只检测脸部、眼睛和中间眼点,而不是鼻子和嘴巴。关于OpenCV,这正是我现在正在研究的! - Lisa Anne
1
我明白了,你需要更强大的工具。那么OpenCV是最好的选择。顺便提一下:你可以使用同一个级联分类器(基于Haar算法是最准确的),以及整套训练集来识别不同的面部特征。 - a.bertucci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接