前言
碰到项目需求要判断上传的图片里只能有一个人,就像到了人脸识别功能,网上查资料说需要用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);}@Overrideprotected 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);}}
}
以上就是全部的实现代码,非常简单,效果感觉还不错。