博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Android 虹软人脸、人证对比,活体检测
阅读量:5826 次
发布时间:2019-06-18

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

hot3.png

最近虹软新增了人证识别、活体检测的功能,好像之前的人脸识别也更新过版本,之前一篇文章用虹软Android SDK做人脸识

别,写过虹软人脸识别的用法,最近把人脸识别、人证识别,活体检测功能都简单的封装了一下,使用起来可以更简单一点;

但是由于appkey是和so库绑定的,所以不能直接依赖,需要下载项目换成自己的so库就能使用或者发布了,还是挺方便的

虹软人脸识别库的介绍`` so库和appkey是绑定的

以人脸识别为例,它包括人脸检测、人脸追踪、人脸识别、年龄识别、性别识别这5种引擎,每个引擎都有一个so库和jar包,申请的5种AppKey和APPID是和自己下载的so库是绑定的,不能混淆使用

人脸检测(FD)

用于获取静态图片的人脸的位置和角度,传入格式为NV21的图片数据(byte[]),返回一个AFD_FSDKFace对象的集合,AFD_FSDKFace只储存了一个位置和角度;如果用于视频流里面好像也不报错

public class AFD_FSDKFace {    Rect mRect;    int mDegree;

人脸追踪(FT)

和人脸检测一样,也是用来获取人脸的位置和角度,不过只适用于获取视频流的人脸,也就是在相机的onPreviewFrame方法里面使用,返回的是AFT_FSDKFace对象的集合,也只储存了一个位置和角度;如果用于静态图片好像是会报错的

public class AFT_FSDKFace {    Rect mRect;    int mDegree;

人脸识别(FR)

用于获取人脸特征和对比人脸特征的 获取人脸特征,需要传入格式为NV21的图片数据(byte[])和人脸的位置、人脸的角度,所以需要先用前面的引擎获取到人脸的信息,返回一个AFR_FSDKFace对象,这个对象也只保存了人脸特征(byte[]) 对比人脸,需要传入两个AFR_FSDKFace对象,返回一个AFR_FSDKMatching对象,只保存了相似度

public class AFR_FSDKFace {    public static final int FEATURE_SIZE = 22020;    byte[] mFeatureData;    ...    public class AFR_FSDKMatching {    float mScore = 0.0F;

活体检测

活体检测是检测是不是活人的,也是传入人脸的位置、人脸的角度,又是一个新的FaceInfo对象,传入的是FaceInfo的集合,返回LivenessInfo集合,但是目前只支持单人脸我们只管第一个数据,LivenessInfo里面保存的返回的结果,活体、非活体、人脸超过一个、未知错误(经常返回,问题不大)

人证对比

用来对比人脸和身份证的,传入传入格式为NV21的证件照片(byte[])和人脸的照片,还有各自的图片大小和比对阈值;返回一个CompareResult对象,包括相似度、是否成功等信息

public class CompareResult {    private boolean isSuccess;    private double result;

人证识别其实是人脸识别的那几个引擎(FD,FT,FR)的集合,所以有同时集成肯定包冲突了,可以使用人脸识别的so库,然后把人脸识别的jar包都删了,使用人证的jar包,人证的激活码使用FR的激活码就行了 在这里插入图片描述 屏幕快照 2018-10-11 下午3.41.05.png-15.5kB

其他的年龄、性别的引擎应该都差不多

封装后的部分功能的展示

初始化AppKey和APPID

new AcrFaceManagerBuilder().setContext(this)                .setFreeSdkAppId(Constants.FREESDKAPPID)                .setFdSdkKey(Constants.FDSDKKEY)                .setFtSdkKey(Constants.FTSDKKEY)                .setFrSdkKey(Constants.FRSDKKEY)                .setLivenessAppId(Constants.LIVENESSAPPID)                .setLivenessSdkKey(Constants.LIVENESSSDKKEY)                .create();    }

相机预览追踪人脸位置

//初始化人脸追踪引擎FaceTrackService faceTrackService = new FaceTrackService();//设置传入的图片的大小faceTrackService.setSize(previewSize.width, previewSize.height); camera.setPreviewCallback(new Camera.PreviewCallback() {                @Override                public void onPreviewFrame(byte[] data, Camera camera) {                    //获取人脸的位置信息                    List
fsdkFaces = faceTrackService.getFtfaces(data); //画出人脸的位置 drawFaceRect(fsdkFaces); //输出数据进行其他处理 cameraPreviewListener.onPreviewData(data.clone(), fsdkFaces); ... } });

相机自己实现,获取人脸位置的代码非常简单,就一句代码,画出人脸的位置实现是用了两个surfaceView,一个用于相机画面展示,另一个画出人脸的位置

画出人脸的位置

值得注意的是获取的人脸的位置Rect是传入的图片的相对位置,图片大小是相机预览设置的大小,画的时候是画在了surfaceView上面,surfaceView一般和预览大小是不一样的,而且还要考虑画面是否旋转、相机的位置等,所以需要先进行转换

Rect rect1=DrawUtils.adjustRect(rect, previewSizeX, previewSizeY,canvas.getWidth(), canvas.getHeight(), cameraOri, cameraId);

获取人脸特征进行注册

//初始化人脸识别引擎FaceRecognitionService faceRecognitionService = new FaceRecognitionService();faceRecognitionService.setSize(width, height);//获取人脸特征AFR_FSDKFace afr_fsdkFace =faceRecognitionService.faceData(data, aft_fsdkFace.getRect(), aft_fsdkFace.getDegree());tv_status.setText("人脸特征为:" + afr_fsdkFace.getFeatureData());

aft_fsdkFace为上一步获取的人脸的位置信息

相机获取的人脸和已保存的人脸进行对比

//获取保存的人脸特征byte[] faceData=faces.get(0).getData();//对比人脸特征float socre=faceRecognitionService.faceRecognition(afr_fsdkFace.getFeatureData(),faceData);tv_status.setText("相似度为:" + sorce);

afr_fsdkFace为上一步获取的人脸的特征,faceData为已保存的人脸特征,也有提供一个人脸和多个对比获取相似度最高的一个的方法

活体检测

//激活活体检测LivenessService.activeEngine(new LivenessActiveListener() {    @Override    public void activeSucceed() {        toast("激活成功");    }     @Override    public void activeFail(String massage) {        LogUtils.log(massage);        toast("激活失败:" + massage);    }});LivenessService livenessService = new LivenessService();//List
faceInfos = new ArrayList<>();faceInfos.add(new FaceInfo(aft_fsdkFace.getRect(), aft_fsdkFace.getDegree()));//判断是否是活体boolean isLive=livenessService.isLive(faceInfos,data);aft_fsdkFace为上一步获取的人脸的位置信息,第一次激活好像需要联网

人证对比

//初始化IdCardVerifyManager.getInstance().init(Constants.IDCARDAPPID, Constants.FRSDKKEY);//bitmap转NV21数据byte[] nv21Data = ImageUtils.getNV21(bitmap.getWidth(), bitmap.getHeight(), bitmap);//传入证件照片DetectFaceResult result = IdCardVerifyManager.getInstance().inputIdCardData(nv21Data, bitmap.getWidth(), bitmap.getHeight());//传入相机获取的人脸数据DetectFaceResult result = IdCardVerifyManager.getInstance().onPreviewData(data, mWidth, mHeight, true);//对比相似度CompareResult compareResult = IdCardVerifyManager.getInstance().compareFeature(THRESHOLD);if (compareResult.isSuccess()) {    tv_status.setText("相似度为:" + compareResult.getResult());}

证件图片是本地的,转成了NV21的格式的byte数组,方法也集成了

图片获取人脸特征

//先把bitmap转NV21格式byte[] photoData = ImageUtils.getNV21(bitmap1.getWidth(), bitmap1.getHeight(), bitmap1);//获取人脸位置信息List
afd_fsdkFaces = faceFindService.findFace(photoData);for (AFD_FSDKFace afdFsdkFace : afd_fsdkFaces) {//获取每一个人脸的特征AFR_FSDKFace afr_fsdkFace = faceRecognitionService.faceData(photoData, afdFsdkFace.getRect(), afdFsdkFace.getDegree());}

引擎释放

livenessService.destoryEngine();faceTrackService.destoryEngine();faceRecognitionService.destroyEngine();IdCardVerifyManager.getInstance().unInit();

效果都还不错,主要是全部免费,源码下载可以直接运行,可以查看所有功能

在这里插入图片描述 屏幕快照 2018-10-11 下午4.50.30.png-32.4kB

demo下载地址: 项目地址:

转载于:https://my.oschina.net/u/3970172/blog/3048793

你可能感兴趣的文章
床头最好不要放这5样东西!震惊了!(鹦鹉地板)
查看>>
vue.js2.0 懒加载实现
查看>>
web deploy + windows server 2008 r2 64bit + iis 7.5
查看>>
HashMap和Hashtable的差别
查看>>
ASP.NET Core学习网站推荐
查看>>
FIDDLER的使用方法及技巧总结[连载2]---FIDDLER用户界面
查看>>
java连接MySQL数据库操作步骤
查看>>
Node.js 从入门到茫然系列——入门篇
查看>>
武汉科技大学ACM :1006: A+B for Input-Output Practice (VI)
查看>>
如何判断主机是大端还是小端(字节序)
查看>>
Tarjan
查看>>
IIS 7.5中的配置
查看>>
生成图形化html报告
查看>>
【开发板资讯】飞凌6410 开发板android更新到2.3,扩大开源量
查看>>
加密/解密/签名/证书-原理介绍
查看>>
MySQL用命令行导出数据库
查看>>
docker 基础
查看>>
使用Fabric自动化你的任务
查看>>
使用maatkit工具检查并同步mysql主从数据
查看>>
mongodb分片集群突然停电造成一些错误,分片无法启动
查看>>