【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.mzph.cn/news/225982.shtml

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

相关文章

清除某条会话的未读消息用engine.clearUnreadCount清除成功 code 是0 的情况下,重新拉取会话,还是未被清除的状态

确认调用清除未读数是否有传入时间戳 确认时间戳是否为 0 &#xff0c;传入时间不可为 0 确认清除时间是否大于最新时间&#xff0c; 不可传入大于当前时间的时间戳 确认传入的时间是否大于要被清除的时间的 senttime 确认传入的时间是否是毫秒单位 如果需要传入最新时间可以获…

SQL连续

SQL连续 1、连续概述2、SQL连续及应用2.1、静态连续2.2、动态连续1、连续概述 连续问题是实际数据开发中比较常见的场景。例如,统计用户连续活跃天数等 SQL如何解决连续问题?本文主要介绍连续性问题,重点以常见的连续活跃场景为例,抽象出通用的连续问题解决方案。连续问题…

CSS盒子的浮动与网页布局(重点,有电影页面案例)

浮动适用于那种盒子的并列布局 CSS 提供了三种传统布局方式(简单说,就是盒子如何进行排列顺序)&#xff1a;  普通流&#xff08;标准流&#xff09;  浮动  定位 标准流&#xff08;普通流/文档流&#xff09; 所谓的标准流: 就是标签按照规定好默认方式排列. 1. 块级…

带下雪背景的登陆注册页面

创建带有下雪背景的登录注册页面涉及HTML、CSS和JavaScript。以下是一个简单的示例&#xff0c;其中使用了HTML和CSS来设置基本的登录和注册表单&#xff0c;并使用JavaScript来创建下雪的效果。请注意&#xff0c;此示例中的雪花效果是通过CSS和JavaScript组合实现的。 HTML&…

abap 如何debug 更新进程

今天在测试环境做一个外向交货单过账的时候&#xff0c;每次都会dump ST22中看到报错如下&#xff1a;DBSQL_DUPLICATE_KEY_ERROR 接着我就去SM13去看下在哪个跟新里面失败了 双击错误条目可以看到 那么我就想说去debug看看当时的变量到底是啥&#xff0c;为啥会主键重复&…

数据库的三大范式

第一范式&#xff1a; 属性不可分割&#xff1a;每个属性都是不可分割的原子项&#xff08;实体的属性就是表中的列&#xff09; 在上表中contact应该分为phone和adress两列 第二范式&#xff1a; 在满足第一范式的情况下&#xff0c;表中不存在部分依赖&#xff0c;非主键列…

2.91【random模块】

random模块 模块导入 import random基本用法 【1】random.random()生成随机浮点数 a random.random() print(a) # 0.07785349807479613【2】uniform(a,b)用于返回a,b之间的随机浮点数 a random.uniform(10, 51) print(a) # 25.71555099886598【3】randint()返回a,b之间的…

压缩包文件暴力破解 -Server2005(解析)

任务五十一: 压缩包文件暴力破解 任务环境说明:Server2005 1. 通过本地PC中渗透测试平台Kali使用Nmap扫描目标靶机服务版本信息,将 Telnet 版本信息字符串 作为 Flag 提交; flag:Microsoft Windows XP telnetd 2. 通过本地PC中渗透测试平台Kali对服务器场景Windows进行渗透测…

云演CTF Blog

1、啥也搞不了&#xff0c;扫目录。出来个console 2、有显示锁掉了 3、抓包&#xff0c;改返回包 改成true&#xff0c;放包 不好意思&#xff0c;不会了&#xff0c;哈哈哈哈哈哈哈哈哈 你会的话&#xff0c;请告诉我&#xff0c;大佬

C++:命名空间

从今天正式开始对C的学习&#xff0c;这里只学习C对C的拓展&#xff0c;和C相同的部分在C语言专栏中都可以找到&#xff0c;我们先看一段C代码 #include<iostream> using namespace std; int main() {cout<<"hello world<<endl;return 0; } 同样也是打…

数学公式推导中 “:=“和“:=“的区别

A:B 将A定义为&#xff08;记为&#xff0c;令为&#xff09;B A:B 将B定义为&#xff08;记为&#xff0c;令为&#xff09;A

redis的hash实现

hash实现 redis的hash数据结构和java的HashMap虽然不同&#xff0c;但是有异曲同工之妙&#xff0c;value是键值对&#xff0c;相当于HashMap&#xff0c;对于hash碰撞也是采用的类似于HashMap的处理方式&#xff0c;数组链表&#xff0c;更适合存储对象&#xff0c;将一个对象…

YOLOv8-Seg改进:轻量化卷积设计 | DualConv双卷积魔改v8结构

🚀🚀🚀本文改进: DualConv双卷积魔改v8结构,达到轻量化的同时并能够实现小幅涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何训练YOLOv8-seg; 2)模型创新,提升分割性能…

​【EI会议征稿中】#先投稿,先送审#第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)​

#先投稿&#xff0c;先送审# 第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 2024年3月1日-3日 | 中国南京 会议官网&#xff1a…

漏刻有时数据可视化Echarts组件开发(45)机场流程导航线和指示点的开发记录

路径线 ECharts中的路径线是指用于连接起点和终点的线。在ECharts中&#xff0c;路径图主要用于带有起点和终点信息的线数据的绘制&#xff0c;如地图上的航班、路线等。路径线可以用于展示数据点之间的连接关系&#xff0c;以及数据点之间的相对位置。 {//路径图name: 路线图…

Mr. Cappuccino的第65杯咖啡——MacOS安装Docker

MacOS安装Docker 下载Docker安装Docker查看Docker相关信息镜像加速 下载Docker Docker官网 Docker文档中心 Docker桌面版下载地址 安装Docker 查看Docker相关信息 docker --versiondocker info镜像加速 阿里云镜像加速器 "registry-mirrors": ["https://gq8…

【Mypy】超级实用的python高级库!

今天&#xff0c;我很兴奋地向大家介绍一个神奇的Python库&#xff1a;Mypy。这个库是Python世界中的一颗璀璨明星&#xff0c;提供了静态类型检查的强大功能&#xff0c;极大地增强了Python这门动态类型语言的健壮性和可维护性。我们将深入探索Mypy的多个方面&#xff0c;并通…

SpringBoot 源码解析2:启动流程1

SpringBoot 源码解析2&#xff1a;启动流程1 1.启动方式2.SpringBootApplication3.SpringApplication3.1 构造器SpringApplication3.2 SpringApplication#run 3.3 SpringApplication#run 中关键方法3.1 SpringApplication#prepareEnvironment3.2 SpringApplication#prepareCont…

BIM 技术:角色漫游

本心、输入输出、结果 文章目录 BIM 技术&#xff1a;角色漫游前言BIM角色漫游中&#xff0c;用户如何与建筑模型进行交互手势识别技术在BIM角色漫游中的应用有哪些图示花有重开日&#xff0c;人无再少年实践是检验真理的唯一标准 BIM 技术&#xff1a;角色漫游 编辑&#xff1…

如何理解《注意力机制真的懂得“集中注意力”吗?》

在文章《从熵不变性看Attention的Scale操作》中&#xff0c;我们就从“集中注意力”的角度考察过Attention机制&#xff0c;当时我们以信息熵作为“集中程度”的度量&#xff0c;熵越低&#xff0c;表明Attention越有可能集中在某个token上。 但是&#xff0c;对于一般的Attent…