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


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

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

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


9800
2018-02-05 09:52


起源



答案:


FaceDetectionListener是您想要用来检测面部的,但它只能侦听相机。这是它唯一的原生功能。如果你真的想在用户设备上的图片上使用它,我建议你只需下载相机API的源代码并根据需要调整你想要的方法。

你可以在这里找到所有股票Android代码的来源: https://android.googlesource.com/

祝你好运!


3
2018-02-11 15:20



谢谢,但我还没能真正找到Camera API的源代码(我搜索过)。对此有任何帮助表示赞赏。 - Lisa Anne
尝试查看此处的代码: android.googlesource.com/platform/packages/apps/Camera/+/master 如果它不在那里,它很可能是在硬件框架中。让我知道事情的后续。 - NathanTempelman
实际上没有任何内容: code.google.com/a/eclipselabs.org/p/face-recognition-android/...   不管怎么说,还是要谢谢你 - Lisa Anne
那两个链接怎么样? - NathanTempelman
嗨Nathan并感谢,到目前为止其他链接没有成功。我可能会在错误的地方寻找 - Lisa Anne


答案:


FaceDetectionListener是您想要用来检测面部的,但它只能侦听相机。这是它唯一的原生功能。如果你真的想在用户设备上的图片上使用它,我建议你只需下载相机API的源代码并根据需要调整你想要的方法。

你可以在这里找到所有股票Android代码的来源: https://android.googlesource.com/

祝你好运!


3
2018-02-11 15:20



谢谢,但我还没能真正找到Camera API的源代码(我搜索过)。对此有任何帮助表示赞赏。 - Lisa Anne
尝试查看此处的代码: android.googlesource.com/platform/packages/apps/Camera/+/master 如果它不在那里,它很可能是在硬件框架中。让我知道事情的后续。 - NathanTempelman
实际上没有任何内容: code.google.com/a/eclipselabs.org/p/face-recognition-android/...   不管怎么说,还是要谢谢你 - Lisa Anne
那两个链接怎么样? - NathanTempelman
嗨Nathan并感谢,到目前为止其他链接没有成功。我可能会在错误的地方寻找 - Lisa Anne


如果你需要的是检测存储在设备上的图像中的面部,你绝对可以做到这一点,而无需破解android的源代码!

有一个 FaceDetector 包下可用的API android.media 自API 1开始接受 Bitmap 作为输入(格式为565格式并给你那张照片中面孔的位置。

以下是您需要的步骤:

1-加载 Bitmap 并将其转换为 565 format (假设你有 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


6
2018-02-16 18:41



谢谢!但正如你在上面的评论中所看到的那样,我也在研究检测鼻子和嘴巴 FaceDetector 无法提供。 - Lisa Anne
你可以使用 OpenCV,或者尝试实施口鼻检测算法,因为您知道眼睛的位置。您可以看到OpenCV中的代码来获取想法 - iTech
的确这就是我目前正在做的事情。谢谢! - Lisa Anne


你知道吗? FaceDetector 类?它自API v1以来就已经存在并且运行良好。如果你需要更多的东西 高级 你可以随时使用一些专用的框架,比如 OpenCV的 (也提供了一些Java绑定,以便轻松集成到Android应用程序中)

您可以查看我之前与同事发表的一些(过时的,但仍然有用的)文章:

  1. Andriod Part-I的人脸检测
  2. Andriod Part-II的人脸检测

2
2018-02-16 18:39



谢谢!我知道了 FaceDetector  上课,但你可能知道它只能检测到脸,眼睛和中间点。不是鼻子和嘴巴。关于OpenCV,它实际上是我现在正在研究的内容! - Lisa Anne
我明白了,你需要更强大的东西。 OpenCV是最好的选择。只需注意:你可以使用相同的级联分类器(基于哈尔的最准确)以及一整套训练集来识别不同的面部特征。 - a.bertucci