人脸识别第三方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

Android 用虹软SDK做人脸识别相关推荐

  1. android虹软人脸识别简书,Android 用虹软SDK做人脸识别

    人脸识别第三方sdk比较多,但是大多都是收费的或者限制次数什么的,虹软的效果还不错,全免费也不需要联网 V1.2版本使用和快速集成:https://www.jianshu.com/p/8dee89ec ...

  2. java如何使用虹软sdk_Java使用虹软SDK做人脸识别之十分简单的入门

    操作系统:Windows10 64位 编程语言:Java 使用spring boot 开发工具:IDEA 一.下载虹软SDK 进入虹软官网 https://ai.arcsoft.com.cn/ 右上角 ...

  3. 虹软java接摄像头_Java使用虹软SDK做人脸识别之十分简单的入门

    操作系统:Windows10 64位 编程语言:Java 使用spring boot 开发工具:IDEA 一.下载虹软SDK 进入虹软官网 https://ai.arcsoft.com.cn/ 右上角 ...

  4. android 虹软人脸存储,用虹软Android SDK做人脸识别

    wallhaven-703709.jpg 人脸识别第三方sdk比较多,但是大多都是收费的或者限制次数什么的,虹软的效果还不错,全免费也不需要联网 官网下载sdk,还要引入一个依赖,用来转换把bitma ...

  5. C#基于虹软SDK的人脸识别签到系统

    1.简介 基于C#windows窗体的人脸识别签到系统 使用了AForge.dll获取USB摄像头 虹软SDK来识别人脸信息 Sql Server 2008 R2 存储数据库 这个项目是为了大学的桌面 ...

  6. 虹软java接摄像头_java基于虹软sdk实现人脸识别(demo)

    开发环境准备: 开发使用到的软件和工具: Jdk8. mysql 5.7.libarcsoft_face.dll(so).libarcsoft_face_engine.dll(so).libarcso ...

  7. Android基于虹软SDK实现离线人脸识别

    一.需求 Android端实现离线人脸识别功能,即对比两张人脸是否是同一个人. 二.解决方案 选用虹软人脸识别SDK来实现人脸特征数据比对. 三.步骤 1. 打开虹软开发者中心 开发者中心 2. 新建 ...

  8. android人脸识别demo_C#开发实录:基于免费SDK实现人脸识别应用开发

    随着人脸识别技术应用范围不断扩展,如何在Windows C#上基于免费SDK实现人脸识别应用开发,正成为开发者们关心的话题之一. 对于该需求,我推荐虹软视觉开放平台的ArcFace 3.0,免费.离线 ...

  9. java用虹软人脸识别SDK实现人脸识别,运行ArcSoft的Java版本Demo出错,未检出人脸

    java.lang.UnsatisfiedLinkError: Can't load library: d:\face_libs\libarcsoft_ java用虹软人脸识别SDK实现人脸识别 网上 ...

最新文章

  1. 静态时序分析的概念以及约束的作用理解
  2. 专用ADC与群集软件之比较
  3. C++实现大数的减法
  4. centos7 界面中文都是方块_Centos 7 项目管理系统部署之Trac(一)
  5. 图片裁剪功能集成优化
  6. SAP产品和微信的结合
  7. springmvc dao怎么可以不写实现类_SpringMVC(一)细聊ContextLoaderListener 是怎么被加载的...
  8. Iterator主要有三个方法:hasNext()、next()、remove()详解
  9. Java 日志管理最佳实践
  10. IT专用英语词汇1500词
  11. 墨刀原型设计工具学习体会——临摹网易云音乐App
  12. 【Python】音节判断
  13. indesign选中不了图片删除_文件夹删除不了怎么办?文件夹删除不了的解决方法...
  14. 果园节水灌溉能否实现远程智能控制
  15. LaTeX字体设置(二)
  16. linux重新初始化网络命令,如何在Ubuntu 18.04 Bionic Beaver Linux上重新启动网络
  17. app电池续航上下--Android自动化测试学历历程
  18. 硬件常见问题——信号过冲
  19. SQL语句的优化(常规SQL语句的优化)
  20. STM32使用stm32cubemx LL库系列教程

热门文章

  1. 面试官本拿求素数搞我,但被我优雅的“回击“了(素数筛)
  2. 动态创建表格给同一个标签创建点击事件并让点击事件操作内容不一样
  3. java中类与对象回顾总结
  4. [转]chroot的使用
  5. python的数组属性_[Python]numpy use array属性,pythonnumpy,使用,数组
  6. 面积积分_被积函数的奇偶性问题(定积分、重积分、线积分、面积分)
  7. We Are Cisco|25年后,为什么我仍是思科认证互联网专家
  8. 云计算运维累不累_关于云计算运维管理要点的知识分享
  9. 阿里云消息队列 RocketMQ、Kafka 荣获金融级产品稳定性测评 “先进级” 认证
  10. php 阻塞消息队列,linux 消息队列阻塞