详解android人脸检测你一定会遇到的坑-创新互联

笔者今年做了一个和人脸有关的android产品,主要是获取摄像头返回的预览数据流,判断该数据流是否包含了人脸,有人脸时显示摄像头预览框,无人脸时摄像头预览框隐藏,看上去这个功能并不复杂,其实在开发过程中,遇到的问题也不多,全部都处理了,在正式推出前,这个产品在公司内部也测试了几个月,也没发现bug,但最近实施人员,在客户公司做实施时,反馈回来各种问题,这些问题有部分是程序bug,也有一部分是和硬件有关,因为测试环境有限,笔者无法对各种型号,各个厂家的硬件进行测试,这篇文章主要是记录,摄像头给我们带来的一些坑,分享给涉及到人脸开发的朋友,让大家少走弯路。

弥渡ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

一:概述

Android SDK 中支持人脸检测,它提供了一个直接在位图上进行人脸检测的方法,这个 API 是android.media.FaceDetector,源文件路径是:


frameworks/base/media/java/android/media/FaceDetector.java


调用 findFaces 方法就可进行人脸检测,该方法返回检测到的人脸总数,并且会将每个”人脸”的信息保存在FaceDetector.Face 的数组中。每个 Face 都包含下面几点信息:

  1. 该 Face 为人脸的可信度.取值范围是 0~1,大于 0.3 则表明可信度较高。
  2. 双眼之间的距离
  3. 双眼中点的 x,y 坐标
  4. 脸部的欧拉角度,可用于判断抬头,侧脸的角度等。

识别流程是这样的:


1. 读取一张图片至 Bitmap,且该 Bitmap 必须是 565 格式。


2. 调用 findFaces 方法分析 Bitmap(注意待分析的 Bitmap 宽度必须是偶数),将探测到的人脸数据存储在一个FaceDetector.Face 数组中,并返回检测到的人脸总数。Android SDK 中的 FaceDetector 介绍

android有原生的api做人脸检测,通过android.media.FaceDetector来检测bitmap是否包含人脸,android.media.FaceDetector.Face来检测人脸位置信息,我们需要在activity中实现Carema.PreviewCallBack接口,该接口有一个onPreviewFrame方法,这个方法返回摄像头实时图像的数据流,由于这个方法返回的数据流时nv21格式,我们需要转换bitmap才能进行人脸检测,转换过程如下:byte[] --> YuvImage --> ByteArrayOutputStream --> byte[] -->  bitmap ,具体转换的代码如下:

Camera.Size size = mtCamera.getParameters().getPreviewSize();
YuvImage yuvImage = new YuvImage(mData, ImageFormat.NV21, size.width, size.height, null);
yuvImage.compressToJpeg(new Rect(0, 0, size.width, size.height), 100, mBitmapOutput);
options.inPreferredConfig = Bitmap.Config.RGB_565;
bitmap = BitmapFactory.decodeByteArray(mBitmapOutput.toByteArray(), 0, mBitmapOutput.toByteArray().length, options);
mBitmapOutput.reset();
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mMatrix, false);

当前标题:详解android人脸检测你一定会遇到的坑-创新互联
文章地址:http://scyanting.com/article/dojhco.html