【Android】在Android上使用mlKit构建人脸检测程序

在Android上构建人脸检测程序

目录

1、导入mlKit依赖包

java 复制代码
dependencies {
  // ...
  // Use this dependency to bundle the model with your app
  implementation 'com.google.mlkit:face-detection:16.1.5'
}

依赖地址:mlkit

2、配置人脸检测器并且获取人脸检测器

java 复制代码
// 1、配置人脸检测器
FaceDetectorOptions faceDetectorOptions = new FaceDetectorOptions.Builder()
        .setPerformanceMode(PERFORMANCE_MODE_FAST)
        .build();
//2、获取人脸检测器
FaceDetector detector = FaceDetection.getClient(faceDetectorOptions);

人脸检测器Api有如下,这里使用了最简单的作为样例:

3、加载图片资源

java 复制代码
// 3、从资源中加载图片
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test3);
imgView.setImageBitmap(bitmap);
InputImage image = InputImage.fromBitmap(bitmap, 0);

这里使用Bitmap,将图片进行转化,然后制作成InputImage流。

4、调用人脸检测器

java 复制代码
// 4、处理图片
  detector.process(image)
          .addOnSuccessListener(new OnSuccessListener<List<Face>>() {
              @Override
              public void onSuccess(List<Face> faces) {
                  Log.e("TAG", "onSuccess: " + 1);
                  imgView.setImageBitmap(drawWithRectangle(faces));
              }
          })
          .addOnFailureListener(new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                  Notice();
              }
          });

5、绘制矩形边框

java 复制代码
private void Notice() {
    Toast.makeText(this, "识别失败", Toast.LENGTH_SHORT);
}

/**
 *
 * 为人脸绘制边框
 *
 * @param faces 采集的人脸
 * @return {@link Bitmap}
 */
private Bitmap drawWithRectangle(List<Face> faces) {

    //复制一个新的Bitmap
    Bitmap copiedBitmap = bitmap.copy(bitmap.getConfig(), true);;

    for (Face face : faces) {
        //获取边界状态
        Rect bounds = face.getBoundingBox();
        // 初始化Paint
        Paint paint = new Paint();
        // 设置矩形颜色
        paint.setColor(Color.BLUE);
        // 设置绘制样式为轮廓绘制
        paint.setStyle(Paint.Style.STROKE);
        // 设置为你需要的宽度
        paint.setStrokeWidth(10);

        Canvas canvas = new Canvas(copiedBitmap);
        canvas.drawRect(bounds, paint);
    }
    return copiedBitmap;
}

6、完整代码

java 复制代码
import static com.google.mlkit.vision.face.FaceDetectorOptions.PERFORMANCE_MODE_FAST;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.mlkit.vision.common.InputImage;
import com.google.mlkit.vision.face.Face;
import com.google.mlkit.vision.face.FaceDetection;
import com.google.mlkit.vision.face.FaceDetector;
import com.google.mlkit.vision.face.FaceDetectorOptions;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ImageView imgView;
    private Bitmap bitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imgView = findViewById(R.id.imageView);
        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // 1、配置人脸检测器
                FaceDetectorOptions faceDetectorOptions = new FaceDetectorOptions.Builder()
                        .setPerformanceMode(PERFORMANCE_MODE_FAST)
                        .build();
                //2、获取人脸检测器
                FaceDetector detector = FaceDetection.getClient(faceDetectorOptions);

                // 3、从资源中加载图片
                bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test3);
                imgView.setImageBitmap(bitmap);
                InputImage image = InputImage.fromBitmap(bitmap, 0);

                // 4、处理图片
                detector.process(image)
                        .addOnSuccessListener(new OnSuccessListener<List<Face>>() {
                            @Override
                            public void onSuccess(List<Face> faces) {
                                Log.e("TAG", "onSuccess: " + 1);
                                imgView.setImageBitmap(drawWithRectangle(faces));
                            }
                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Notice();
                            }
                        });
            }
        });

    }

    private void Notice() {
        Toast.makeText(this, "识别失败", Toast.LENGTH_SHORT);
    }

    /**
     *
     * 为人脸绘制边框
     *
     * @param faces 采集的人脸
     * @return {@link Bitmap}
     */
    private Bitmap drawWithRectangle(List<Face> faces) {

        //复制一个新的Bitmap
        Bitmap copiedBitmap = bitmap.copy(bitmap.getConfig(), true);;

        for (Face face : faces) {
            //获取边界状态
            Rect bounds = face.getBoundingBox();
            // 初始化Paint
            Paint paint = new Paint();
            // 设置矩形颜色
            paint.setColor(Color.BLUE);
            // 设置绘制样式为轮廓绘制
            paint.setStyle(Paint.Style.STROKE);
            // 设置为你需要的宽度
            paint.setStrokeWidth(10);

            Canvas canvas = new Canvas(copiedBitmap);
            canvas.drawRect(bounds, paint);
        }
        return copiedBitmap;
    }

}

在相机中识别也是同样的方法,只不过换成相机的视频流。

7、效果展示

相关推荐
DogDaoDao4 小时前
Android 硬件编码器参数完全指南:MediaCodec 深度解析
android·音视频·视频编解码·h264·硬编码·视频直播·mediacodec
JohnnyDeng945 小时前
Android 自定义 View:Canvas 绘图与事件分发深度解析
android
Android小码家8 小时前
Framework之Launcher小窗开发
android·framework·虚拟屏·小窗
赏金术士8 小时前
第七章:状态管理实战与架构总结
android·ui·kotlin·compose
颂love9 小时前
MySQL的执行流程
android·数据库·mysql
云起SAAS14 小时前
抖音小游戏源码 - 消消乐 | 含激励广告+成就系统 | 开箱即用商业级消除游戏模板
android·游戏·广告联盟·看激励广告联盟流量主·抖音小游戏源码 - 消消乐
大貔貅喝啤酒15 小时前
基于Windows下载安装Android Studio 3.3.2版本教程(2026详细图文版)
android·java·windows·android studio
程序员码歌15 小时前
OpenSpec 到 Superpowers:AI 编码从说清到做对
android·前端·人工智能
2501_9151063215 小时前
深入解析无源码iOS加固原理与方案,保护应用安全
android·安全·ios·小程序·uni-app·cocoa·iphone
黄林晴19 小时前
重磅官宣:Android UI 开发正式进入 Compose-first 时代
android·google io