wallhaven-703709.jpg

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

官网下载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 result = new ArrayList();

//设置最多识别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 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 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();

android 虹软人脸存储,用虹软Android SDK做人脸识别相关推荐

  1. Android 用虹软SDK做人脸识别

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

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

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

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

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

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

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

  5. android studio文件存储路径,配置Android Studio的缓存文件路径(释放你的C盘)

    Android Studio默认安装完后会在C:\Users\YourName.xxx 缓存一些数据,有限的C盘很容易爆增. 如果你的C盘也像我这样捉襟见肘,或者你是处女座的,那么请看完本文,结果会让 ...

  6. 数据存储之——Android文件存储系统及文件系统(Android Q)

    Android存储系统及存储的挂载 Android是基于Linux内核开发的,所以它的文件系统也是跟Linux文件系统类似. 首先我们来看Android存储的分类. 内部存储和外部存储.内置SD卡和外 ...

  7. android 手机存储 目录,android 62 手机存储目录的划分

    android下应用程序的路径和javase不同,应用程序的数据要保存自己的文件夹里面 > > getFileDir(); 获取自己的文件夹 /data/data/包名(应用程序的名字)/ ...

  8. 【Android】虹软、安卓、Uniapp、SpringBoot 实现人脸识别

    [Android]虹软.安卓.Uniapp.SpringBoot 实现人脸识别 简要概述 后台使用的是springboot,本地开发集成的是window是的版本,发布到线上需要改成Linux的版本 如 ...

  9. Android基于虹软(ArcSoft)实现从0到1的人脸识别demo

    Android基于虹软(ArcSoft)实现从0到1的人脸识别demo 1.在虹软的开发者中心创建一个自己的应用,将APP_ID与SDK_KEY记录下来,后面会用到.创建完后就可以下载SDK了. 2. ...

最新文章

  1. 【Git报错】 ! [rejected] master - master (fetch first)
  2. 常用js代码整理、收集
  3. Shell脚本传递带有空格的参数
  4. 地址总线与数据传送机制
  5. hibernate教程--检索方式详解(hql,sql,QBC)
  6. 【牛客 - 368D】动态连通块(并查集+bitset优化)
  7. 【计算机就业-算法工程师】校招想去互联网公司担任算法工程师该怎么准备
  8. Python Flask服务同时接收单个、多个上传的文件
  9. SpringCloud 微服务网关Gateway 动态路由配置
  10. python的else_Python3 if...elseif...else语句
  11. java day60【 Spring 中的 JdbcTemplate[会用] 、Spring 中的事务控制 、Spring5 的新特性[了解] 】...
  12. 计算机基础知识上机操作excer,excel上机操作题及答案
  13. 中M22春C、Java入门练习( 7-13 后天 )
  14. postman全方位讲解(有空看下)
  15. 对登录验证功能进行GUI设计
  16. 《LeetCode刷题》—121. 买卖股票的最佳时机
  17. 【软件应用】word数学公式插件TeXsword安装
  18. Camera | 4.瑞芯微平台MIPI摄像头应用程序编写
  19. c++ 中的 LPCTSTR类型
  20. 饥荒机器人升级上限多少_饥荒机器人满级属性是多少?血量有多高

热门文章

  1. cn2.php中文,Python使用cn2an实现中文数字与阿拉伯数字的相互转换
  2. 一个本科渣渣是怎么逆袭从咸鱼到Offer收割机的?大厂面经合集
  3. 解决高德地图在线API不支持对应的方法回调返回结果的问题
  4. Java计算数组中元素的总和
  5. 国产FPGA智多晶烧写SA5Z系列SoC FPGA FLASH烧写错误解决
  6. 【Flutter】Text的使用
  7. Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localizati论文精读及资源整理
  8. 计算机网络(期末复习5、6章)
  9. STM32物联网通讯GPRS
  10. flask+vue+websocket+neo4j+torch模型项目常见报错