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

在Android上构建人脸检测程序

目录

  • 1、导入mlKit依赖包
  • 2、配置人脸检测器并且获取人脸检测器
  • 3、加载图片资源
  • 4、调用人脸检测器
  • 5、绘制矩形边框
  • 6、完整代码
  • 7、效果展示

1、导入mlKit依赖包

dependencies {// ...// Use this dependency to bundle the model with your appimplementation 'com.google.mlkit:face-detection:16.1.5'
}

依赖地址:mlkit

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

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

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

3、加载图片资源

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

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

4、调用人脸检测器

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

5、绘制矩形边框

private void Notice() {Toast.makeText(this, "识别失败", Toast.LENGTH_SHORT);
}/**** 为人脸绘制边框** @param faces 采集的人脸* @return {@link Bitmap}*/
private Bitmap drawWithRectangle(List<Face> faces) {//复制一个新的BitmapBitmap copiedBitmap = bitmap.copy(bitmap.getConfig(), true);;for (Face face : faces) {//获取边界状态Rect bounds = face.getBoundingBox();// 初始化PaintPaint 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、完整代码

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;@Overrideprotected 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() {@Overridepublic 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>>() {@Overridepublic void onSuccess(List<Face> faces) {Log.e("TAG", "onSuccess: " + 1);imgView.setImageBitmap(drawWithRectangle(faces));}}).addOnFailureListener(new OnFailureListener() {@Overridepublic 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) {//复制一个新的BitmapBitmap copiedBitmap = bitmap.copy(bitmap.getConfig(), true);;for (Face face : faces) {//获取边界状态Rect bounds = face.getBoundingBox();// 初始化PaintPaint 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、效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/278622.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

肚子排气方法

1&#xff0c;保持30s的抱膝。 2&#xff0c;身体侧卧&#xff0c;打开髋和骨盆。停留20-30s。 3&#xff0c;脚后跟抬起&#xff0c;重心放在脚前掌&#xff0c;腹部贴大腿&#xff0c;双手左侧右侧来回转&#xff0c;10次。 4&#xff0c;吹风机&#xff0c;热风从脚开始打热…

uniGUI for Delphi UniSweetAlert控件详解

UniSweetAlert是UniGUI后期版本新增的一个界面友好的消息提示和输入控件&#xff0c;是ShowMessageN的升级版&#xff0c;UniSweetAlert增加了更多的可控制属性。 属性介绍 1、AlertType&#xff1a;提示类型&#xff0c;分为atError、atSuccess、atInfo、atQuestion、atWarni…

产品入门第五讲:Axure交互和情境

目录 一.Axure交互和情境的介绍 1.交互介绍 概念 常见的Axure交互设计技巧 2.情境介绍 概念 常见的Axure情境设计技巧&#xff1a; 二.实例展示 1.ERP登录页到主页的跳转 2.ERP的菜单跳转到各个页面 &#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个…

Github 2023-12-16开源项目日报Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-16统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目2非开发语言项目2TypeScript项目1Jupyter Notebook项目1Go项目1PHP项目1JavaScript项目1C#项目1 精…

实战 | OpenCV传统方法实现密集圆形分割与计数(详细步骤 + y源码)

导 读 本文主要介绍基于OpenCV传统方法实现密集圆形分割与计数应用,并给详细步骤和代码。 背景介绍 实例图片来源于网络,目标是分割下图中圆形目标并计数。 本文实现效果如下: 实现步骤 【1】灰度转换 + 均值滤波 + 二值化,得到参考背景 img = cv2.imread(src.jpg)c…

【论文阅读】Uncertainty-aware Self-training for Text Classification with Few Label

论文下载 GitHub bib: INPROCEEDINGS{mukherjee-awadallah-2020-ust,title "Uncertainty-aware Self-training for Few-shot Text Classification",author "Subhabrata Mukherjee and Ahmed Hassan Awadallah",booktitle "NeurIPS",yea…

浅析LDPC软解码对SSD延迟的影响-part1

此前&#xff0c;存储随笔有发布一篇关于SSD QoS相关问题&#xff0c;文章中有从以下方面做了全景的分析&#xff1a; 扩展阅读&#xff1a; 全景解析SSD IO QoS性能优化 SSD基础架构与NAND IO并发问题探讨 本文主要在之前文章的基础上&#xff0c;再做个补充&#xff0c;本…

【Java】5分钟读懂Java虚拟机架构

5分钟读懂Java虚拟机架构 Java虚拟机&#xff08;JVM&#xff09;架构JVM是如何工作的&#xff1f;1. 类加载器子系统2. 运行时数据区3. 执行引擎 相关资料 本文阐述了JVM的构成和组件。每个Java开发人员都知道字节码经由JRE&#xff08;Java运行时环境&#xff09;执行。但他们…

PythonGame图形绘制函数详解

文章目录 五种图形矩形圆形 五种图形 除了直线之外&#xff0c;pygame中提供了多种图形绘制函数&#xff0c;除了必要的绘图窗口、颜色以及放在最后的线条宽度之外&#xff0c;它们的参数如下表所示 函数图形参数/类型rect矩形Rectellipse椭圆Rectarc椭圆弧Rect, st, edcircl…

拼多多买家页面批量导出订单excel

拼多多买家页面批量导出订单excel 由于拼多多不支持订单导出excel清算起来很麻烦&#xff0c;就自己写了一个页面批量导出脚本代码。 首先打开拼多多手机端网站&#xff1a;https://mobile.pinduoduo.com/ 登录后点击我的订单打开f12审查元素 在控制台引入jquery&#xff0c;引…

Python等比例缩放图片并修改对应的Labelme标注文件(v2.0)

Python等比例缩放图片并修改对应的Labelme标注文件&#xff08;v2.0&#xff09; 前言前提条件相关介绍实验环境Python等比例缩放图片并修改对应的Labelme标注文件Json文件代码实现输出结果 前言 此版代码&#xff0c;相较于Python等比例缩放图片并修改对应的Labelme标注文件&a…

巴贝拉葡萄酒是单一品种还是混合品种制成的?

大多数巴贝拉葡萄酒都是由单一的巴贝拉葡萄品种制成的&#xff0c;许多意大利葡萄酒商开始尝试在巴贝拉葡萄酒中加入其它葡萄品种&#xff0c;其中两个最受欢迎的意大利品种是皮埃蒙特的巴贝拉德阿尔巴和达斯蒂。和朋友在一家意大利餐厅吃饭&#xff0c;被酒单吓到了&#xff1…