作者:ngzhaicai9672364 | 来源:互联网 | 2023-08-20 10:27
前言碰到项目需求要判断上传的图片里只能有一个人,就像到了人脸识别功能,网上查资料说需要用opencv等各种图像库,项目肯定不能接受,没想到Android很早就已经集成了人脸识别的功
前言
碰到项目需求要判断上传的图片里只能有一个人,就像到了人脸识别功能,网上查资料说需要用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 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);
}
}
}
以上就是全部的实现代码,非常简单,效果感觉还不错。