Android 用虹软SDK做人脸识别

人脸识别第三方sdk比较多,但是大多都是收费的或者限制次数什么的,虹软的效果还不错,全免费也不需要联网

V1.2版本使用和快速集成:https://www.jianshu.com/p/8dee89ec4a24(Android集成虹软人脸、人证对比,活体检测)

虹软官网https://ai.arcsoft.com.cn/

  

官网下载sdk,还要引入一个依赖,用来转换把bitmap以一定的格式转为byte[]的

api ‘com.guo.android_extend:android-extend:1.0.1‘

  

官网的demo里面其实就写的比较清楚了,总共分为两个部分,一个是人脸注册,一个是人脸识别,先提取人脸特征,再和之前提取的比较得出相似度,可以根据相似度来判断是不是一个人

人脸注册

就是提取人脸的特征,一张图片可以识别出多个人脸特征(如果有多个人脸),特征是一个byte数组,其实不用图片,获取相机的预览回调获取图片数据这种方法也是很好的,反正传入图片数据就可以,分为以下几步:
初始化要提取人脸识别的图片数据

//初始化图片数据
byte[] data = new byte[mBitmap.getWidth() * mBitmap.getHeight() * 3 / 2];
ImageConverter convert = new ImageConverter();
convert.initial(mBitmap.getWidth(), mBitmap.getHeight(), ImageConverter.CP_PAF_NV21);
if (convert.convert(mBitmap, data)) {
Log.d(TAG, "convert ok!");
}
convert.destroy();

  

首先获取了一个AFD_FSDKFace的集合,用来保存传入引擎检测的人脸信息,其中包括了人脸的角度和一个Rect对象,Rect对象就是人脸在图片中的位置,可以根据这个Rect来把人脸部分标记出来什么的

//初始化
AFD_FSDKEngine engine = new AFD_FSDKEngine();
AFD_FSDKVersion version = new AFD_FSDKVersion();
List<AFD_FSDKFace> result = new ArrayList<AFD_FSDKFace>();
//设置最多识别5张人脸
AFD_FSDKError err = engine.AFD_FSDK_InitialFaceEngine(FaceDB.appid, FaceDB.fd_key, AFD_FSDKEngine.AFD_OPF_0_HIGHER_EXT, 16, 5);

//获取人脸信息 result
err = engine.AFD_FSDK_GetVersion(version);
err = engine.AFD_FSDK_StillImageFaceDetection(data, mBitmap.getWidth(), mBitmap.getHeight(), AFD_FSDKEngine.CP_PAF_NV21, result);

  

根据获取到的AFD_FSDKFace集合和原图像获取人脸的特征,每个AFD_FSDKFace都可以获取到一个AFR_FSDKFace对象,包括就是一个byte[]类型的变量mFeatureData用来保存人脸特征,和一个引擎定义的特征信息数据长度int类型的变量FEATURE_SIZE(不用管这个)

//初始化
AFR_FSDKVersion version1 = new AFR_FSDKVersion();
AFR_FSDKEngine engine1 = new AFR_FSDKEngine();
AFR_FSDKFace result1 = new AFR_FSDKFace();
AFR_FSDKError error1 = engine1.AFR_FSDK_InitialEngine(FaceDB.appid, FaceDB.fr_key);
error1 = engine1.AFR_FSDK_GetVersion(version1);

//获取人脸特征 mAFR_FSDKFace
error1 = engine1.AFR_FSDK_ExtractFRFeature(data, mBitmap.getWidth(), mBitmap.getHeight(), AFR_FSDKEngine.CP_PAF_NV21, new Rect(result.get(0).getRect()), result.get(0).getDegree(), result1);

if(error1.getCode() == error1.MOK) {
mAFR_FSDKFace = result1.clone();
}

//销毁引擎,释放内存资源
engine1.AFR_FSDK_UninitialEngine();
engine.AFD_FSDK_UninitialFaceEngine();

  

其实mAFR_FSDKFace里面的byte[]类型的变量mFeatureData就是需要的人脸特征,自己随便保存一下,人脸识别的时候再拿出来对比
人脸识别
人脸识别方式就是再获取到人脸的特征和之前保存的人脸特征对比,获取的方式有很多,除了上面的图片来获取以外还可以通过调用相机的预览回调来获取数据来获取人脸的特征再去对比,这样体验比较好和现在手机常用的人脸识别方法一样,自定义相机就不写出来了,步骤如下:

//初始化
public static List<AFT_FSDKFace> resultAtf;
AFT_FSDKEngine engine;
AFT_FSDKError err;
AFR_FSDKEngine engine2;
AFR_FSDKError error2;
AFR_FSDKFace result;
byte[] faceData;
resultAtf = new ArrayList<>();
engine = new AFT_FSDKEngine();
err = engine.AFT_FSDK_InitialFaceEngine(FaceDB.appid, FaceDB.ft_key, AFT_FSDKEngine.AFT_OPF_0_HIGHER_EXT, 16, 5);
err = engine.AFT_FSDK_GetVersion(new AFT_FSDKVersion());
engine2 = new AFR_FSDKEngine();

result = new AFR_FSDKFace();
error2 = engine2.AFR_FSDK_InitialEngine(FaceDB.appid, FaceDB.fr_key);
error2 = engine2.AFR_FSDK_GetVersion(new AFR_FSDKVersion());

  

//需要设置相机预览图片的格式
para.setPreviewFormat(ImageFormat.NV21);

  

//相机预览回调获取数据
byte[] faceData;
private Camera.PreviewCallback mPreViewCallback = new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(final byte[] data, Camera camera) {
if (startFaceCheck) {
err = engine.AFT_FSDK_FaceFeatureDetect(data, mWidthPicture, mHeightPreview, AFT_FSDKEngine.CP_PAF_NV21, resultAtf);
faceData = data.clone();
}
}
};

  

获取到数据后获取人脸特征然后开始对比,方法就是这样,逻辑可以自己设计,也可以根据获取到的人脸数据AFD_FSDKFace来实时的画出人脸的位置

//获取到人脸的信息
resultAtf.clear();
startFaceCheck = true;
error2 = engine2.AFR_FSDK_ExtractFRFeature(faceData, mWidthPicture, mHeightPreview, AFR_FSDKEngine.CP_PAF_NV21, resultAtf.get(resultAtf.size() - 1).getRect(), resultAtf.get(resultAtf.size() - 1).getDegree(), result);

//初始化对比
AFR_FSDKMatching score = new AFR_FSDKMatching();
AFR_FSDKFace input = new AFR_FSDKFace();

//这是获取我保存的人脸数据,就是有个名字加一个人脸特征
List<FaceDiscern> faceDiscernList = MLiteOrm.getInstance().query(FaceDiscern.class);

for (int i = 0; i < faceDiscernList.size(); i++) {
final String name = faceDiscernList.get(i).getUserName();
input.setFeatureData(faceDiscernList.get(i).getFaceId());
error2 = engine2.AFR_FSDK_FacePairMatching(result, input, score);
//获取相似度
float max = 0.0f;
max = score.getScore();
if (max > 0.6) {
ToastUtils.showLong("验证通过,操作人:" + name);
}
}

//销毁引擎,释放内存资源
engine2.AFR_FSDK_UninitialEngine();
engine.AFT_FSDK_UninitialFaceEngine();

  

原文地址:https://www.cnblogs.com/Zzz-/p/10559398.html

时间: 2024-08-01 16:53:50

Android 用虹软SDK做人脸识别的相关文章

Android使用Face++ SDK进行人脸识别和年龄检测

Face++的官网: http://www.faceplusplus.com.cn/ 可以识别照片中的人脸位置,人物的年龄,性别,种族,是否微笑等信息. 首先创建应用,会分配给我们一个API Key和API Secret,然后下载"Java SDK(Android)",导入Jar包和库文件,参考官方的Demo进行编写. 1.FaceDetectUtil帮助类: package com.zms.carlauncher.util; import java.io.ByteArrayOutpu

支持Android、iOS系统的人脸识别技术

随着深度学习方法的应用,支持Android.iOS系统的人脸识别技术的识别率已经得到质的提升,目前我司的支持Android.iOS系统的人脸识别技术率已经达到99%.支持Android.iOS系统的人脸识别技术与其他生物特征识别技术相比,在实际应用中具有天然独到的优势:通过摄像头直接获取,可以非接触的方式完成识别过程,方便快捷.目前我司的支持Android.iOS系统的人脸识别技术已应用在金融.教育.景区.旅运.社保等领域. 支持Android.iOS系统的人脸识别技术主要分为两部分: 第一部为

IOS 通过摄像头读取每一帧的图片,并且做识别做人脸识别(swift)

最近帮别人做一个项目,主要是使用摄像头做人脸识别 github地址:https://github.com/qugang/AVCaptureVideoTemplate 要使用IOS的摄像头,需要使用AVFoundation 库,库里面的东西我就不介绍. 启动摄像头需要使用AVCaptureSession 类. 然后得到摄像头传输的每一帧数据,需要使用AVCaptureVideoDataOutputSampleBufferDelegate 委托. 首先在viewDidLoad 里添加找摄像头设备的代

活体检测-用照片来做人脸识别可行吗?

随着科技的迅速发展,智能化也越来越发达,并慢慢进入到我们日常生活中来了.如考勤 早期是人工记录,签到,然后是打卡,刷卡,再到指纹.现在已经发展到更加先进的人脸识别考勤了. 卡可以代打,代刷,但是牵涉到指纹和人脸,行不行呢? 指纹考勤,是代替不了的,尤其是半导体指纹.之前非思丸的文章中有说过原理. 那么,用照片来做人脸识别的考勤可以吗?脸上长痘痘了,还可以正常考勤吗? 答案是,不可以,这里非思丸作为脸部识别考勤机的厂家,为您详细的说明: 人脸识别技术是基于人的脸部特征信息进行身份识别的一种生物识别

C#实现基于ffmpeg加虹软Arcface的人脸识别demo

对开发库的C#封装,屏蔽使用细节,可以快速安全的调用人脸识别相关API.具体见github地址.新增对.NET Core的支持,在Linux(Ubuntu下)测试通过.具体的使用例子和Demo详解,参见博客地址. 更新: 增加对V1.1两个新功能的支持. 关于人脸识别 目前的人脸识别已经相对成熟,有各种收费免费的商业方案和开源方案,其中OpenCV很早就支持了人脸识别,在我选择人脸识别开发库时,也横向对比了三种库,包括在线识别的百度.开源的OpenCV和商业库虹软(中小型规模免费). 百度的人脸

人脸识别算法虹软arcface和Dlib对比

我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用人脸识别功能.基于这些考虑,我司需要寻找其他的方案.通过搜索,目前发现,开源或免费支持离线的方案也有不少.目前初步考虑虹软 ArcFace和Dlib.通过官方的demo 和 网上的资料,写了个工程,也可以在这里看.这里说一下要注意的摄像头是使用了 OpenCV 来处理的,这里可能会涉及到预览图和屏幕

虹软人脸识别应用开发过程

趁空闲的一点点时间向大家分享一个好用的人脸识别的应用--来自虹软公司的人脸识别推荐这家的产品主要有以下几个理由~1.免费!免费!免费!它家比较良心.人脸识别.人证核验.活体检测等等一切的sdk都是免费下载使用的- -即使商用也可以~非常适合我这种小穷人2.根据不同操作平台提供不同的SDK目前可下载Windows x86,x64平台(c++/Java语言).Linux x64平台(c++/Java语言).iOS平台(Objective-C语言)与Android arm32平台(Java语言)3.官

android上实现人脸识别的功能

====================问题描述==================== 如题,小弟想在android上实现一个基于人脸识别的功能,大致的实现框架是这样的: 1.通过前置照相机捕捉到人的脸部特征2.将人的脸部特征通过一些算法(网上查看诸如adaboost算法,PCA算法)取得特征值,然后ID化3.将人脸ID化的结果存入数据库4.重复1,2如果ID化的结果在人脸特征值数据库中某记录值的阈值范围内,则证明该值存在,通过验证,否则,提醒注册人脸特征库. 现在基本确定实现是这样的一个流程

【下载】推荐一款免费的人脸识别SDK

现已进入刷脸的时代,例如,人脸支付.人脸识别的门禁.人流监控等等.如何在Firefly开源板上快速搭建DEMO,并快速产品化?为了让更多产品可以用上人脸识别技术,Firefly推出了一款高性能人脸识别SDK.此SDK的人脸识别的算法,运行效率高,识别精确度高,性能优异,可以直接应用于商业产品. 下文主要讲述如何在Firefly RK3399平台部署并测试OpenFace SDK,Let's GO!      一.Firefly RK3399开源板安装Ubuntu 16.04系统固件      系