前言

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

实现效果

实现接口

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);        }    }}

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

更多相关文章

  1. Android(安卓)textView drawableXX图片大小
  2. android 拍照和从相册选择组件
  3. android WebView 预览office文档
  4. Android(安卓)ApiDemos示例解析(3): App->Activity->Animation
  5. afinallogoAndroid的快速开…
  6. android 下载图片及时显示
  7. android 按照字母的顺序排序
  8. Android相册及小小秒表震动(17)
  9. 动态加载Dex的原理

随机推荐

  1. Android(安卓)数独游戏 记录
  2. Android学习笔记(8) - GridView与ImageVi
  3. android 之View 一
  4. android中Menu介绍
  5. 6.22 android计算字符高度宽度,红蓝3D图片
  6. 由 Sense 4.0 说开去: Android 第三方定制
  7. Android程序开发初级教程(一)
  8. Android下使用dlopen函数动态调用.so链接
  9. 深入理解:Android 编译系统
  10. Android多进程app中Application回调onCre