博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 用虹软SDK做人脸识别
阅读量:4480 次
发布时间:2019-06-08

本文共 4377 字,大约阅读时间需要 14 分钟。

人脸识别第三方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
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);//获取人脸信息 resulterr = 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_FSDKFaceerror1 = 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() {@Overridepublic 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();

  

转载于:https://www.cnblogs.com/Zzz-/p/10559398.html

你可能感兴趣的文章
数据仓库创建以及开发人员操作的基本命令
查看>>
【翻译】Ext JS最新技巧——2014-5-12
查看>>
关于float和margin
查看>>
简单的正则解析
查看>>
【原创】StreamInsight查询系列(七)——基本查询操作之基础排序
查看>>
C# 安装包制作
查看>>
【P2564】生日礼物(单调队列)
查看>>
Instuments工具
查看>>
新创建django项目,但网页打不开127.0.0.1:8000
查看>>
Python练习-内置函数的应用
查看>>
洛谷P3905 道路重建
查看>>
数据表格 - DataGrid - 行编辑
查看>>
HQL查询语句
查看>>
jsp听课笔记(四)
查看>>
vim
查看>>
数组的键/值操作函数
查看>>
Android单点触控与多点触控切换的问题解决方案
查看>>
JS常用函数与方法
查看>>
十、Shell基础
查看>>
py16 面向对象深入
查看>>