Android Camera2 集成人脸识别算法

这可能是全网唯一一篇介绍Android Camera2接口集成人脸算法的文章了~

写在前面:

说起人脸识别,相信大家都不会感到陌生,在我们平时的工作生活中,人脸打卡刷脸支付等等已经是应用的非常广泛了,人脸识别也给我们的生活带来了极大的便利。

这篇文章的目的是让大家了解熟悉Android平台上人脸算法集成的基本流程(针对应用层的集成)。相信读完这篇文章后,大家会觉的,原来集成人脸识别算法也是so easy。

0cb899e61152b3fd0b7106a18111e57f.png

这篇文章将针对下面几点展开介绍:

一、Android平台人脸识别流程图

二、ArcSoft人脸识别算法sdk下载

三、Camera2 API 集成 ArcSoft人脸识别算法

一、Android平台人脸识别流程图

人脸识别流程图基本如下图所示。

用一句话来说就是获取camera数据,送到算法中进行识别,最后显示识别结果。

cca3eb6b1900636a626d6e1b39a79d1b.png

二、ArcSoft人脸识别算法sdk下载

人脸识别算法很多,如果是高通平台,高通也是有一套人脸识别算法的。我这里选择的是arcsoft的识别算法,这个目前是免费的,而且相对来说算法效果也还不错。

接下来我们看下如何去获取arcsoft的人脸识别sdk。

1)登录arcsoft官网,然后选择进入开发者中心。

(https://ai.arcsoft.com.cn/)

8eb393d7b442db04c4a305f4a5e36feb.png

2)注册并登录开发者中心后,在开发者中心界面,我们选择“新建应用”,然后勾选人脸识别功能。

如下图所示,我创建的应用是“CameraDemo”。这个界面的APP_ID 和SDK_KEY我们后面代码里面需要用到。这个界面还有个“下载SDK”的按钮,点击就可以下载我们需要的sdk demo。

d458f77814de242bba8f026e01d907dc.png

3)Demo下载下来后,我们先跑下arcsoft官方Demo看下效果。

3ce0158a05b0686803d704290c60514e.png

我们选择人脸检测属性(视频)。如下图所示,效果还不错,我们可以看到识别出来的信息里面包含了性别、年龄、是否是真人这些基本信息。

97e8e482c495ce42ff4a5f988eb9ef3f.png

三、Camera2 API 集成 ArcSoft人脸识别算法

通过上面的2步,大家有没觉的集成人脸识别还是蛮简单的。介绍完了官方的demo,那接下来我们看下采用Android Camera2 的api,如何去集成arcsoft的人脸识别算法呢。

1、如下面代码块所示,arcsoft 官方demo采用的是Camera1的api接口,设置的预览数据的回调,回调的直接就是nv21的byte[]数据,然后再把byte[]数据送进去算法处理。

private void initCamera() {DisplayMetrics metrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics);CameraListener cameraListener = new CameraListener() {@Overridepublic void onCameraOpened(Camera camera, int cameraId, int displayOrientation, boolean isMirror) {previewSize = camera.getParameters().getPreviewSize();drawHelper = new DrawHelper(previewSize.width, previewSize.height, previewView.getWidth(), previewView.getHeight(), displayOrientation, cameraId, isMirror, false, false);}@Overridepublic void onPreview(byte[] nv21, Camera camera) {if (faceRectView != null) {faceRectView.clearFaceInfo();}List<FaceInfo> faceInfoList = new ArrayList<>();int code = faceEngine.detectFaces(nv21, previewSize.width, previewSize.height, FaceEngine.CP_PAF_NV21, faceInfoList);if (code == ErrorInfo.MOK && faceInfoList.size() > 0) {code = faceEngine.process(nv21, previewSize.width, previewSize.height, FaceEngine.CP_PAF_NV21, faceInfoList, processMask);if (code != ErrorInfo.MOK) {return;}} else {return;}List<AgeInfo> ageInfoList = new ArrayList<>();List<GenderInfo> genderInfoList = new ArrayList<>();List<Face3DAngle> face3DAngleList = new ArrayList<>();List<LivenessInfo> faceLivenessInfoList = new ArrayList<>();int ageCode = faceEngine.getAge(ageInfoList);int genderCode = faceEngine.getGender(genderInfoList);int face3DAngleCode = faceEngine.getFace3DAngle(face3DAngleList);int livenessCode = faceEngine.getLiveness(faceLivenessInfoList);// 有其中一个的错误码不为ErrorInfo.MOK,returnif ((ageCode | genderCode | face3DAngleCode | livenessCode) != ErrorInfo.MOK) {return;}if (faceRectView != null && drawHelper != null) {List<DrawInfo> drawInfoList = new ArrayList<>();for (int i = 0; i < faceInfoList.size(); i++) {Log.v(TAG,"---faceInfoList.get(i).getRect():"+faceInfoList.get(i).getRect());drawInfoList.add(new DrawInfo(drawHelper.adjustRect(faceInfoList.get(i).getRect()), genderInfoList.get(i).getGender(), ageInfoList.get(i).getAge(), faceLivenessInfoList.get(i).getLiveness(), RecognizeColor.COLOR_UNKNOWN, null));}drawHelper.draw(faceRectView, drawInfoList);}}}

2、接下来我们要介绍的是使用Camera2接口,如何集成arcsoft的人脸识别算法。

我们先来看下我自己写的demo效果图:

d112107884144d9c5521811db629fc3b.png

下面来讲解下代码实现的主要步骤:

(不熟悉Camera2接口的同学,建议先找一篇关于Camera2 API的文章先了解下,关于Camera2,我自己前面也写过算是比较详细的文章介绍,也欢迎大家阅读)

i、初始化imageReader。

mImageReader = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(),ImageFormat.YUV_420_888, 2);mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);

ii、创建session的时候,把imagerReader的surface也add进去。

这样我们就能拿到实时的视频流。

mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),new CameraCaptureSession.StateCallback() {}

iii、在imageReader的实时流回调里面,我们需要把接收到的YUV_420_888的数据先转换成nv21格式,然后再送进arcsoft的人脸检测算法中进行处理

Camera1 接口上,设置预览数据回调后,回调的直接就是nv21格式的数据,相对来说会比Camera2上的处理会简单很多。

不过Android 目前已经不再对Camera旧的架构进行维护,而且目前主流的手机采用的基本上也都是Camera2的接口。所以我们还是非常有必要熟悉掌握Camera2的各种使用。

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener= new ImageReader.OnImageAvailableListener() {@Overridepublic void onImageAvailable(ImageReader reader) {Image image = reader.acquireLatestImage();if(image == null){return;}synchronized (mImageReaderLock) {if(!mImageReaderLock.equals(1)){Log.v(TAG, "--- image not available,just return!!!");image.close();return;}if (ImageFormat.YUV_420_888 == image.getFormat()) {Image.Plane[] planes = image.getPlanes();lock.lock();if (y == null) {y = new byte[planes[0].getBuffer().limit() - planes[0].getBuffer().position()];u = new byte[planes[1].getBuffer().limit() - planes[1].getBuffer().position()];v = new byte[planes[2].getBuffer().limit() - planes[2].getBuffer().position()];}if (image.getPlanes()[0].getBuffer().remaining() == y.length) {planes[0].getBuffer().get(y);planes[1].getBuffer().get(u);planes[2].getBuffer().get(v);if (nv21 == null) {nv21 = new byte[planes[0].getRowStride() * mPreviewSize.getHeight() * 3 / 2];}if(nv21 != null && (nv21.length != planes[0].getRowStride() * mPreviewSize.getHeight() *3/2)){return;}// 回传数据是YUV422if (y.length / u.length == 2) {ImageUtil.yuv422ToYuv420sp(y, u, v, nv21, planes[0].getRowStride(), mPreviewSize.getHeight());}// 回传数据是YUV420else if (y.length / u.length == 4) {ImageUtil.yuv420ToYuv420sp(y, u, v, nv21, planes[0].getRowStride(), mPreviewSize.getHeight());}//调用Arcsoft算法,绘制人脸信息drawFaceInfo(nv21);}lock.unlock();}}image.close();}};

这篇文件介绍的,是针对应用层上的人脸算法集成。

现在很多手机厂商,人脸算法有一部分是在hal层完成的。比如美颜算法这些,直接就是在hal层完成的了,这样处理效率会更高。

3fa447f5b0902155ff73579af6f543f4.png

《Android Camera开发入门》、《Camx初认识》已经上架,可以点击了解 -> 小驰成长圈 |期待见证彼此的成长 30dda9e8be4be8debd9500cb42580ab2.png

d7a906c77d38dcaffaebd345e92b9833.png

觉得不错,点个赞呗 5463dd4fc619f5a5dc06fbe0b8f4d915.png

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

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

相关文章

数据可视化之智慧农业的窗口与引擎

在科技日新月异的今天,农业作为国民经济的基础产业,正逐步向智能化、数字化转型。农业为主题的数据可视化大屏看板,作为这一转型过程中的重要工具,不仅为农业管理者提供了全面、实时的农田信息,还促进了农业资源的优化配置和农业生产效率的提升。本文将深入探讨农业数据可…

Mysql-01-主从搭建

一、安装Mysql 下载 https://downloads.mysql.com/archives/community/ 安装 注意顺序 tar -xvf mysql-8.0.38-1.el9.x86_64.rpm-bundle.tar rpm -ivh mysql-community-common-8.0.38-1.el9.x86_64.rpm rpm -ivh mysql-community-client-plugins-8.0.38-1.el9.x86_64.r…

非NI GPIB卡与LabVIEW兼容性分析

在许多测试和测量应用中&#xff0c;通用接口总线&#xff08;GPIB&#xff09;是一种广泛使用的标准。尽管国家仪器公司&#xff08;NI&#xff09;提供的GPIB硬件和LabVIEW软件的组合被广泛接受和使用&#xff0c;但成本可能较高。因此&#xff0c;一些用户会考虑使用其他厂商…

蓄势高飞逐“新”空,卓翼飞思助力打造低空经济产业领域人才智库

2024年&#xff0c;“低空经济”首次写入政府工作报告&#xff0c;掀开新兴产业的崭新一页&#xff0c;而后迅速在全国各地呈现如火如荼的发展态势。这片蕴藏着巨大潜力和产业的蓝海&#xff0c;正蓄势聚能、乘势而起&#xff0c;站在发展的新风口上&#xff0c;面对新前景和新…

CorelDRAW2024新版本来咯!你的设计神助手

&#x1f389; 设计界的朋友们&#xff0c;注意啦&#xff01;你们的新宠——CorelDRAW 2024 来咯&#xff01; &#x1f31f; 一、设计神器再进化 亲爱的设计小伙伴们&#xff0c;有没有感觉每天与那些不配合的软件战斗&#xff0c;像是在打怪升级&#xff1f;&#x1f409; …

【matlab】智能优化算法——基准测试函数

智能优化算法的基准测试函数是用于评估和优化算法性能的一组标准问题。这些测试函数模拟了真实世界优化问题的不同方面&#xff0c;包括局部最小值、全局最优解、高维度、非线性、不连续等复杂性。以下是对智能优化算法基准测试函数的详细归纳&#xff1a; 测试函数的分类&…

数据结构初阶 遍历二叉树问题(一)

一. 链式二叉树的实现 1. 结构体代码 typedef int BTDateType; typedef struct BinaryTreeNode {BTDateType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right; }BTNode; 大概的图形是这样子 2. 增删查改 我们这里要明确的一点的 二叉树的增删查改是没有意…

springboot + mybatis 多数据源切换

参考的b站博主写的 配置文件: spring:datasource:db1:jdbc-url: jdbc:mysql://localhost:3306/interview_database?useUnicodetrue&characterEncodingutf-8&useSSLfalseusername: rootpassword: 12345driver-class-name: com.mysql.cj.jdbc.Driverdb2:jdbc-url: jdbc…

两年经验前端带你重学前端框架必会的ajax+node.js+webpack+git等技术的个人学习心得、作业及bug记录 Day1

黑马程序员前端AJAX入门到实战全套教程&#xff0c;包含学前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆盖 Day1 你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​…

hdu物联网硬件实验1 小灯闪烁

物联网硬件基础实验报告 学院 班级 学号 姓名 日期 成绩 实验题目 配置环境小灯 实验目的 配置环境以及小灯闪烁 硬件原理 无 关键代码及注释 /* Blink The basic Energia example. Turns on an LED on for one second, then off for one sec…

Mysql-常见DML-DQL-语句语法用法总结

1、常见DML语句 1.1 INSERT语句 说明&#xff1a;将数据插入到数据库表中。 INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); 实例&#xff1a;添加C罗信息到数据库表中 insert into employee (ID, name, gender, entrydate, age) values …

KUKA机器人维修保养消除报警

在使用KUKA机器人时&#xff0c;有时候会遇到示教器信息栏出现“基本检查到期”的信息&#xff0c;这就提示该机器到了基本保养时间了&#xff0c;需要进行保养。 一、报警信息和保养周期&#xff1a; KUKA机器人在使用超过一定保养周期后会出现“基本检查到期 / 中央手动保…

技术分析报告:StorageReview实验室打破π计算世界纪录

StorageReview实验室团队利用先进的计算系统&#xff0c;成功将π计算至202.112.290.000.000位&#xff0c;刷新了自己之前保持的105万亿位的世界纪录。这一成就突显了现代高性能计算&#xff08;HPC&#xff09;和精心设计的商用硬件平台的卓越能力。 关键技术组件&#xff1a…

【Unity navigation面板】

【Unity navigation面板】 Unity的Navigation面板是一个集成在Unity编辑器中的界面&#xff0c;它允许开发者对导航网格&#xff08;NavMesh&#xff09;进行配置和管理。 Unity Navigation面板的一些关键特性和功能&#xff1a; 导航网格代理&#xff08;NavMesh Agent&…

Python爬虫获取视频

验证电脑是否安装python 1.winr输入cmd 2.在黑窗口输入 python.exe 3.不是命令不存在就说明python环境安装完成 抓取快手视频 1.在phcharm应用中新建一个项目 3.新建一个python文件 4.选择python文件,随便起一个名字后按回车 5.安装requests pip install requests 6.寻找需要的…

Beats:使用 Filebeat 从 Python 应用程序中提取日志

本指南演示了如何从 Python 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件&#xff0c;然后你将在 Kibana 中查看日志事件发生的实时可视化。虽然此示例使…

【Python实战因果推断】23_倾向分3

目录 Propensity Score Matching Inverse Propensity Weighting Propensity Score Matching 另一种控制倾向得分的常用方法是匹配估计法。这种方法搜索具有相似可观测特征的单位对&#xff0c;并比较接受干预与未接受干预的单位的结果。如果您有数据科学背景&#xff0c;您可…

Python使用matplotlib绘制图像时,中文图例或标题无法正常显示问题

Python使用matplotlib绘制图像时&#xff0c;中文图例或标题无法显示问题解决方法 一、问题描述二、解决方法 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、问题描述 Matplotlib库是Python中经常使用的绘图工…

如何注册微信公众号

如何注册微信公众号 如何注册一个微信公众号 &#x1f60a;&#x1f4f1;摘要引言正文内容1. 准备工作内容定位和受众群体公众号名称和头像 2. 网页注册流程第一步&#xff1a;访问微信公众平台第二步&#xff1a;选择账户注册类型第三步&#xff1a;填写基本信息第四步&#x…

树型结构数据存储实践

很多业务场景会遇到树形结构的数据&#xff0c;如公司的人员职级树、行政区划树等。 使用类似MySQL的数据库进行存储&#xff0c;需要将树形结构&#xff08;二维&#xff09;存储到行格式&#xff08;一维&#xff09;的db中。 本文介绍了树型结构数据存储的三种方式&#xf…