Android自带人脸识别

前言

碰到项目需求要判断上传的图片里只能有一个人,就像到了人脸识别功能,网上查资料说需要用opencv等各种图像库,项目肯定不能接受,没想到Android很早就已经集成了人脸识别的功能,这里记录一下。

实现效果

Android自带人脸识别_第1张图片

实现接口

Android自带了一个FaceDetector人脸探测器,能够对加载到内存中的Bitmap图片做人脸识别,需要注意的是Bitmap加载的时候一定要指定使用Bitmap.Config.RGB_565的加载类型,其他的都不会有识别效果。

public class FaceDetectorImageView extends AppCompatImageView {
    // 人脸监测对象
    private FaceDetector faceDetector;
    // 识别到的人脸
    private FaceDetector.Face[] faces;

    // 需要识别的图片
    private Bitmap bitmap;
    // 最多需要识别的人数
    private int maxFaces = 10;
    // 真正识别到的人数
    private int realFaces = 0;
    private Paint paint;

    public FaceDetectorImageView(Context context) {
        this(context, null);
    }

    public FaceDetectorImageView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public FaceDetectorImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        BitmapFactory.Options options = new BitmapFactory.Options();
        // 一定要设置,否则无法识别人脸
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.faces, options);

        // 识别人脸数组定义
        faces = new FaceDetector.Face[maxFaces];
        faceDetector = new FaceDetector(bitmap.getWidth(), bitmap.getHeight(), maxFaces);

        // 人脸识别器开始识别,速度还是比较快的,放在主线程也没什么问题
        realFaces = faceDetector.findFaces(bitmap, faces);

        // 初始化画笔工具
        paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(getResources().getColor(R.color.colorAccent));
        paint.setStrokeWidth(5);
        setImageBitmap(bitmap);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 在识别的每个人的眼睛位置画正方形
        for (int i = 0; i < realFaces; i++) {
            FaceDetector.Face face = faces[i];
            float distance = face.eyesDistance();
            PointF mid = new PointF();
            face.getMidPoint(mid);
            canvas.drawRect(mid.x - distance / 2,
                    mid.y - distance / 2,
                    mid.x + distance / 2,
                    mid.y + distance / 2, paint);
        }
    }
}

以上就是全部的实现代码,非常简单,效果感觉还不错。

你可能感兴趣的:(Android学习)