当前位置: 首页 > news >正文

【实战篇】Android安卓本地离线实现视频检测人脸

实战篇Android安卓本地离线实现视频检测人脸

  • 引言
  • 项目概述
  • 核心代码类介绍
  • 人脸检测流程
  • 项目地址
  • 总结

引言

在当今数字化时代,人脸识别技术已经广泛应用于各个领域,如安防监控、门禁系统、移动支付等。本文将以第三视角详细讲解如何基于bifan-wei-Face/Detector:V1.0实现人脸识别。

项目概述

com.github.bifan-wei:FaceDetector:V1.0 是一个人脸识别项目,主要通过 Android 平台的相机采集图像数据,然后利用 FaceDetector 类进行人脸检测,最终将检测结果绘制在界面上。该项目主要包含两个核心文件:FaceDetectTextureView.java 和 IFaceRectView.java。

核心代码类介绍

  • FaceDetectTextureView.java 这个类继承自 TextureView 并实现了 View.OnLayoutChangeListener 接口,主要负责相机的初始化、预览、人脸检测等功能。 关键属性
    mCamera:Camera 对象,用于控制相机的操作,如打开、关闭、预览等。 captureBitmap:Bitmap
    对象,用于存储相机捕获的图像数据。 detectConfig:DetectConfig
    对象,用于存储人脸检测的配置信息,如检测间隔时间、是否开启人脸检测等。 faceRectView:IFaceRectView
    对象,用于绘制人脸检测的边框。 executorService:ExecutorService 对象,用于在后台线程执行人脸检测任务。
    关键方法 initCamera() 和 initCamera(int
    CameraType):用于初始化相机,包括打开相机、设置相机参数、初始化其他相关资源等。
    openCamera():根据配置信息打开指定类型的相机。 detectFace(Bitmap
    captureBitmap):该方法是人脸检测的核心方法,通过 FaceDetector 类检测图像中的人脸。具体步骤如下: 创建
    FaceDetector 对象,指定检测图像的宽度、高度和最大人脸数量。 创建 FaceDetector.Face
    数组,用于存储检测到的人脸信息。 调用 FaceDetector 的 findFaces 方法进行人脸检测,返回检测到的人脸数量。
    如果检测到人脸,更新 DetectConfig 中的 PreFaceTime 为当前时间,并调用 faceRectView 的
    drawFaceBorder 方法绘制人脸边框,最后返回检测到的人脸数组。 如果未检测到人脸,调用 faceRectView 的
    clearBorder 方法清除之前绘制的边框,返回 null。

下面是相关代码

private FaceDetector.Face[] detectFace(Bitmap captureBitmap) {FaceDetector mFaceDetector = new FaceDetector(captureBitmap.getWidth(), captureBitmap.getHeight(), getDetectConfig().DETECT_FACE_NUM);FaceDetector.Face[] mFace = new FaceDetector.Face[getDetectConfig().DETECT_FACE_NUM];int detectedFaceNum = mFaceDetector.findFaces(captureBitmap, mFace);if (detectedFaceNum > 0) {getDetectConfig().PreFaceTime = System.currentTimeMillis();if (faceRectView != null) {faceRectView.drawFaceBorder(mFace, getDetectConfig().Simple);}return mFace;} else {if (faceRectView != null) {faceRectView.clearBorder();}}return null;
}

startCameraPreview() 和 stopCameraPreview():分别用于启动和停止相机预览。
release():释放相机、回收 Bitmap、关闭线程池等资源。

IFaceRectView.java
这是一个接口,定义了两个方法:drawFaceBorder 和 clearBorder,用于绘制人脸检测的边框和清除边框。

public interface IFaceRectView {/*** @param mFace 人脸参数* @param simple 图片压缩率*/void drawFaceBorder(FaceDetector.Face[] mFace, float simple);//清除边框线void clearBorder();
}

人脸检测流程

  • 相机初始化:调用 initCamera() 或 initCamera(int CameraType)
    方法初始化相机,包括打开相机、设置相机参数等。 相机预览:调用 startCameraPreview()
    方法启动相机预览,相机开始采集图像数据。 人脸检测:在 SurfaceTextureListener 的
    onSurfaceTextureUpdated 方法中,根据配置的检测间隔时间,通过 executorService 执行
    FaceCapturedRunnable 任务,在 FaceCapturedRunnable 的 run 方法中调用 detectFace
    方法进行人脸检测。 绘制边框:如果检测到人脸,调用 faceRectView 的 drawFaceBorder
    方法绘制人脸边框;如果未检测到人脸,调用 faceRectView 的 clearBorder 方法清除之前绘制的边框。
    资源释放:在不需要使用相机时,调用 release() 方法释放相机、回收 Bitmap、关闭线程池等资源。

项目地址

人脸识别demo加源代码

总结

通过上述步骤,我们可以基于 com.github.bifan-wei:FaceDetector:V1.0 实现一个简单的人脸识别功能。该项目主要利用 Android 平台的相机采集图像数据,通过 FaceDetector 类进行人脸检测,并将检测结果绘制在界面上。在实际应用中,可以根据需求对项目进行扩展和优化,如添加人脸识别算法、提高检测精度等。
希望本文对大家理解人脸识别技术的实现有所帮助,如果你有任何问题或建议,欢迎在评论区留言。

相关文章:

【实战篇】Android安卓本地离线实现视频检测人脸

实战篇Android安卓本地离线实现视频检测人脸 引言项目概述核心代码类介绍人脸检测流程项目地址总结 引言 在当今数字化时代,人脸识别技术已经广泛应用于各个领域,如安防监控、门禁系统、移动支付等。本文将以第三视角详细讲解如何基于bifan-wei-Face/De…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter3-语言基础

三、语言基础 ECMAScript 的语法很大程度上借鉴了 C 语言和其他类 C 语言,如 Java 和 Perl。ECMAScript 中一切都区分大小写。无论是变量、函数名还是操作符,都区分大小写。 所谓标识符,就是变量、函数、属性或函数参数的名称。标识符可以由…...

(dpdk f-stack)-堆栈溢出-野指针-内存泄露(问题定位)

目的:解决堆栈溢出,野指针,内存泄露。 解决方法 [root@ test]# yum install libasan [root@ test]# cat test.c int main() { int array[10]; array[11] = 11; return 0; } [root@ test]# gcc -fsanitize=address -O1 -fno-omit-frame-pointer -g -O0 test.c -o test ./te…...

HTML5 教程之标签(3)

HTML5 <center> 标签 (已废弃) 定义和用法 <center> 标签对其包围的文本进行水平居中处理。HTML5不支持使用<center>标签&#xff0c;因此有关该标签的更多信息&#xff0c;请参考“HTML <center>标签”部分&#xff01; 示例: <center>这个…...

【蓝桥】动态规划-简单-破损的楼梯

题目 解题思路 完整代码 #include <bits/stdc.h> using namespace std; const int N1e59; const long long p1e97; long long dp[N];//dp[i]表示走到第i级台阶的方案数 bool broken[N];//broken代表破损台阶的数组 int main() {int n,m;cin>>n>>m;for(int …...

如何自定义软件安装路径及Scoop包管理器使用全攻略

如何自定义软件安装路径及Scoop包管理器使用全攻略 一、为什么无法通过WingetUI自定义安装路径&#xff1f; 问题背景&#xff1a; WingetUI是Windows包管理器Winget的图形化工具&#xff0c;但无法直接修改软件的默认安装路径。原因如下&#xff1a; Winget设计限制&#xf…...

107,【7】buuctf web [CISCN2019 华北赛区 Day2 Web1]Hack World

这次先不进入靶场 看到红框里面的话就想先看看uuid是啥 定义与概念 UUID 是 Universally Unique Identifier 的缩写&#xff0c;即通用唯一识别码。它是一种由数字和字母组成的 128 位标识符&#xff0c;在理论上可以保证在全球范围内的唯一性。UUID 的设计目的是让分布式系…...

STM32 ADC单通道配置

硬件电路 接线图&#xff1a; ADC基本结构图 代码配置 根据基本结构框图 1.定义结构体变量 //定义结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量 ADC_InitTypeDef ADC_InitStructure; //定义ADC结构体变量 2.开启RCC时钟 ADC、GPIO的时钟&#x…...

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制 一. 数据同步 在之前的学习中有了副本Replica的概念,解决了数据备份的问题。我们还需要面临一个设计难题即:如何处理分区中Leader与Follwer节点数据同步不匹配问题所带来的风险,这也是保证数据高可用的…...

Spring的三级缓存如何解决循环依赖问题

循环依赖问题是在对象之间存在相互依赖关系&#xff0c;形成一个闭环&#xff0c;导致无法准确的完成对象的创建和初始化&#xff0c;当两个或多个对象彼此之间相互引用&#xff0c;这种相互引用形成一个循环时&#xff0c;就可能出现循环依赖问题。 在 Spring 框架中&#xf…...

Ext文件系统

文件内容属性 被打开的文件在内存中&#xff0c;没有被打开的文件在磁盘里文件系统的工作就是根据路径帮我们找到在磁盘上的文件 磁盘&#xff08;硬件&#xff09; 磁盘的存储结构 磁头在传动臂的运动下共同进退&#xff0c;向磁盘写入的时候是向柱面批量写入的 OS文件系统访…...

回溯算法---数独问题

回溯算法理论基础 回溯和递归密不可分&#xff0c;有回溯就有递归&#xff0c;所谓回溯就是基于一个叉树&#xff0c;可能是二叉树或者是三叉树&#xff0c;从root节点开始深度优先搜索遍历节点&#xff0c;当遍历到一个子节点时&#xff0c;回溯到上一个根节点选择另外一个子…...

蓝桥杯python基础算法(2-1)——排序

目录 一、排序 二、例题 P3225——宝藏排序Ⅰ 三、各种排序比较 四、例题 P3226——宝藏排序Ⅱ 一、排序 &#xff08;一&#xff09;冒泡排序 基本思想&#xff1a;比较相邻的元素&#xff0c;如果顺序错误就把它们交换过来。 &#xff08;二&#xff09;选择排序 基本思想…...

【课程笔记】信息隐藏与数字水印

文章总览:YuanDaiMa2048博客文章总览 【课程笔记】信息隐藏与数字水印 信号处理基础知识隐写系统隐写算法性能指标音频信号处理基础数字音频概念人类听觉系统与语音质量评价信息隐藏的原理数字指纹与版权保护盲水印与非盲水印私钥水印与公钥水印信息隐藏的研究层次信息隐藏与数…...

Page Assist实现deepseek离线部署的在线搜索功能

前面文章Mac 基于Ollama 本地部署DeepSeek离线模型 实现了deepseek的离线部署&#xff0c;但是部署完成虽然可以进行问答和交互&#xff0c;也有thinking过程&#xff0c;但是没办法像官方一样进行联网搜索。今天我们介绍一款浏览器插件Page Assist来实现联网搜索&#xff0c;完…...

composeUI中Box 和 Surface的区别

在 Jetpack Compose 中&#xff0c;Box 和 Surface 都是常用的布局组件&#xff0c;但它们的用途和功能有所不同。 Box 组件&#xff1a; 功能&#xff1a;Box 是一个用于将子组件堆叠在一起的布局容器&#xff0c;类似于传统 Android 中的 FrameLayout。用途&#xff1a;适用…...

【LeetCode】5. 贪心算法:买卖股票时机

太久没更了&#xff0c;抽空学习下。 看一道简单题。 class Solution:def maxProfit(self, prices: List[int]) -> int:cost -1profit 0for i in prices:if cost -1:cost icontinueprofit_ i - costif profit_ > profit:profit profit_if cost > i:cost iret…...

MySQL表的CURD

目录 一、Create 1.1单行数据全列插入 1.2多行数据指定列插入 1.3插入否则更新 1.4替换 2.Retrieve 2.1 select列 2.1.1全列查询 2.1.2指定列查询 2.1.3查询字段为表达式 2.1.4为查询结果指定别名 2.1.5结果去重 2.2where条件 2.3结果排序 2.4筛选分页结果 三…...

Java 如何覆盖第三方 jar 包中的类

目录 一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理 背景&#xff1a; 在我们日常的开发中&#xff0c;经常需要使用第三方的 jar 包&#xff0c;有时候我们会发现第三方的 jar 包中的某一个类有问题&#xff0c;或者我们需要定制化修改其中的逻辑&#xff0c…...

VSCode中使用EmmyLua插件对Unity的tolua断点调试

一.VSCode中搜索安装EmmyLua插件 二.创建和编辑launch.json文件 初始的launch.json是这样的 手动编辑加上一段内容如下图所示&#xff1a; 三.启动调试模式&#xff0c;并选择附加的进程...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...