安卓人脸检测之FaceDetector

时间:2021-08-20 21:13:52

最近看到一个APP的头像上传时,如果你设置的图片里面没有人脸,或者有两张以及以上人脸的时候,会提示你图片不符合规范,让你重新设置,这样是为了确保用户的头像是人!

    然后我就在网上查看了一下资料,发现谷歌原生Android里面提供了API,那就是我们今天要介绍的FaceDetector,下面我来给大家介绍一下:


FaceDetector检测到的并不是人的全脸,而只是双眼。

实际测试中,发现图片太小的话检测不到人脸,试验中使用小于100x100的图片检测不到人脸,但是由于Android内存有限,图片太大的话,会出现无法加载图片的异常。图片的格式必须为Bitmap RGB565格式。

文档  findFaces(Bitmap bitmap, Face[] faces)方法中有说明。

方法有

float confidence() ;可信度(0-1)


  float eyesDistance(); 双眼的距离


   void getMidPoint(PointF point);设置双眼的中点


   float pose(int euler); 眼睛的pose,传入的为欧拉轴检索的角度。

下面我们可以来写一个例子:

public class FaceView extends ImageView {
public static final String TAG = "FaceView";



public FaceView(Context context) {
super(context);
init();
}

public FaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

private int imageWidth, imageHeight;
private int numberOfFace = 6; //最大检测的人脸数
   private FaceDetector myFaceDetect; //人脸识别类的实例
   private FaceDetector.Face[] myFace; //存储多张人脸的数组变量
   float myEyesDistance; //两眼之间的距离
   int numberOfFaceDetected; //实际检测到的人脸数
   Bitmap myBitmap;

private void init() {
BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();
BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; //构造位图生成的参数,必须为565。类名+enum
       myBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.icon, BitmapFactoryOptionsbfo);
imageWidth = myBitmap.getWidth();
imageHeight = myBitmap.getHeight();
myFace = new FaceDetector.Face[numberOfFace]; //分配人脸数组空间
       myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace);
numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); //FaceDetector 构造实例并解析人脸
       Log.i("lixuce", "numberOfFaceDetected is " + numberOfFaceDetected);
}

/**
    * 对每个人脸进行画框
    */
   @Override
   protected void onDraw(Canvas canvas) {
canvas.drawBitmap(myBitmap, 0, 0, null); //画出位图
       Paint myPaint = new Paint();
myPaint.setColor(Color.GREEN);
myPaint.setStyle(Paint.Style.STROKE);
myPaint.setStrokeWidth(3); //设置位图上paint操作的参数

       for (int i = 0; i < numberOfFaceDetected; i++) {
FaceDetector.Face face = myFace[i];
PointF myMidPoint = new PointF();
face.getMidPoint(myMidPoint);
myEyesDistance = face.eyesDistance(); //得到人脸中心点和眼间距离参数,并对每个人脸进行画框
           canvas.drawRect( //矩形框的位置参数
                   (int) (myMidPoint.x - myEyesDistance),
(int) (myMidPoint.y - myEyesDistance),
(int) (myMidPoint.x + myEyesDistance),
(int) (myMidPoint.y + myEyesDistance),
myPaint);
}

}
}

然后将这这个控件放入到xml文件里面就可以了,这样就可以识别出你提供的照片里面有多少张脸了,下面给大家看一下效果图:

安卓人脸检测之FaceDetector


是不是觉得很神奇,大家一定要记得,你获取图片的bitmap的时候解码方式一定要用565,否则可能会闪退,或者检测不出来,好了就介绍到这里了,感兴趣的小伙伴赶紧去试一试吧!