【实战篇】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>标签,因此有关该标签的更多信息,请参考“HTML <center>标签”部分! 示例: <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自定义安装路径? 问题背景: WingetUI是Windows包管理器Winget的图形化工具,但无法直接修改软件的默认安装路径。原因如下: Winget设计限制…...
107,【7】buuctf web [CISCN2019 华北赛区 Day2 Web1]Hack World
这次先不进入靶场 看到红框里面的话就想先看看uuid是啥 定义与概念 UUID 是 Universally Unique Identifier 的缩写,即通用唯一识别码。它是一种由数字和字母组成的 128 位标识符,在理论上可以保证在全球范围内的唯一性。UUID 的设计目的是让分布式系…...
STM32 ADC单通道配置
硬件电路 接线图: 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的三级缓存如何解决循环依赖问题
循环依赖问题是在对象之间存在相互依赖关系,形成一个闭环,导致无法准确的完成对象的创建和初始化,当两个或多个对象彼此之间相互引用,这种相互引用形成一个循环时,就可能出现循环依赖问题。 在 Spring 框架中…...
Ext文件系统
文件内容属性 被打开的文件在内存中,没有被打开的文件在磁盘里文件系统的工作就是根据路径帮我们找到在磁盘上的文件 磁盘(硬件) 磁盘的存储结构 磁头在传动臂的运动下共同进退,向磁盘写入的时候是向柱面批量写入的 OS文件系统访…...
回溯算法---数独问题
回溯算法理论基础 回溯和递归密不可分,有回溯就有递归,所谓回溯就是基于一个叉树,可能是二叉树或者是三叉树,从root节点开始深度优先搜索遍历节点,当遍历到一个子节点时,回溯到上一个根节点选择另外一个子…...
蓝桥杯python基础算法(2-1)——排序
目录 一、排序 二、例题 P3225——宝藏排序Ⅰ 三、各种排序比较 四、例题 P3226——宝藏排序Ⅱ 一、排序 (一)冒泡排序 基本思想:比较相邻的元素,如果顺序错误就把它们交换过来。 (二)选择排序 基本思想…...
【课程笔记】信息隐藏与数字水印
文章总览:YuanDaiMa2048博客文章总览 【课程笔记】信息隐藏与数字水印 信号处理基础知识隐写系统隐写算法性能指标音频信号处理基础数字音频概念人类听觉系统与语音质量评价信息隐藏的原理数字指纹与版权保护盲水印与非盲水印私钥水印与公钥水印信息隐藏的研究层次信息隐藏与数…...
Page Assist实现deepseek离线部署的在线搜索功能
前面文章Mac 基于Ollama 本地部署DeepSeek离线模型 实现了deepseek的离线部署,但是部署完成虽然可以进行问答和交互,也有thinking过程,但是没办法像官方一样进行联网搜索。今天我们介绍一款浏览器插件Page Assist来实现联网搜索,完…...
composeUI中Box 和 Surface的区别
在 Jetpack Compose 中,Box 和 Surface 都是常用的布局组件,但它们的用途和功能有所不同。 Box 组件: 功能:Box 是一个用于将子组件堆叠在一起的布局容器,类似于传统 Android 中的 FrameLayout。用途:适用…...
【LeetCode】5. 贪心算法:买卖股票时机
太久没更了,抽空学习下。 看一道简单题。 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 包中的类
目录 一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理 背景: 在我们日常的开发中,经常需要使用第三方的 jar 包,有时候我们会发现第三方的 jar 包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,…...
VSCode中使用EmmyLua插件对Unity的tolua断点调试
一.VSCode中搜索安装EmmyLua插件 二.创建和编辑launch.json文件 初始的launch.json是这样的 手动编辑加上一段内容如下图所示: 三.启动调试模式,并选择附加的进程...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
