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

  

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

  1. C# 虹软SDK视频人脸识别和注册

    一,准备工作 1.Afoge视频参数类 using AForge.Video.DirectShow; using System; using System.Collections.Generic; u ...

  2. ArcFace虹软与Dlib人脸识别对比

    我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用 ...

  3. 使用虹软ArcFac,java 离线SDK 进行人脸识别

    公司项目需要人脸识别登录,需要支持离线识别,所以无法使用在线的人脸识别的API,于是使用到了离线SDK来对比识别人脸相识度. 获取人脸抓拍的图片需要对接设备,这里不做记录,假设我们已经获取到了人脸图片 ...

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

    最近帮别人做一个项目,主要是使用摄像头做人脸识别 github地址:https://github.com/qugang/AVCaptureVideoTemplate 要使用IOS的摄像头,需要使用AV ...

  5. .NET做人脸识别并分类

    .NET做人脸识别并分类 在游乐场.玻璃天桥.滑雪场等娱乐场所,经常能看到有摄影师在拍照片,令这些经营者发愁的一件事就是照片太多了,客户在成千上万张照片中找到自己可不是件容易的事.在一次游玩等活动或家 ...

  6. C# 虹软离线SDK引擎 人脸识别

    一,背景 整体来说虹软的人脸识别SDK还是不错的.我们测试过Face++的,百度的,腾讯的,都是在线联网的,需要把上传数据到它们服务器,不利商业用途:虹软SDK支持离线. 二,下载虹软SDK 1.注册 ...

  7. Android 虹软2.0人脸识别,注册失败问题 分析synchronized的作用

    人脸识别需要init初始化(FaceServer中),离开时需要unInit销毁:当一个含有人脸识别的界面A跳向另一个含有人脸识别的界面B时,由于初始化和销毁都是对FaceServer类加锁(sync ...

  8. python 调用百度接口 做人脸识别

    操作步骤差不多,记得要在百度AIPI中的控制台中创建对应的工单 创建工单成功后 会生成两个key  这个两个key是要生成tokn 用 这里大家可以用 def函数 将token返回 供下面的接口使用 ...

  9. 基于虹软 2.0 人脸识别猜年龄 java版 demo

    首先感谢虹软,是你们提供这么好的SDK支撑了我们的想象力! 这是一个用javav编写的可视化应用,用户通过自己的脸和计算机进行交互,计算机则通过萌萌女孩的语音和用户对话.核心程序就是利用ArcFace ...

随机推荐

  1. Js扩容

    /*脚本统一调用工具(企业端)*/ //杂项工具 var MiscUtils = { //去除字符串中所有的空格 ClearStringEmpty: function (str) { var strR ...

  2. 第五章 CSS常用属性笔记

    1. span标签 突显,强调局部文字的作用. 2.字体样式 font-size: 字体大小 font-style:normal,italic(倾斜) font-weight:normal,bold( ...

  3. 谈论linux同组多用户操作问题

    同组多用户,最先起到什么作用这个我也是不明白的, 然后乱搞了一堆, 下面我做个笔记帮组日后分析. 一个用户组承载多个用户, 像这样 这是我原先的思路.然后就是chenglee用户和chenglee12 ...

  4. Kali系列之multi/handler(渗透win7)

    环境 靶机 192.168.137.133 kali 192.168.137.135 步骤+ 生成后门 msfvenom -p windows/meterpreter/reverse_tcp LHOS ...

  5. 20145221高其_Final

    20145221高其_Final 免考题目 密码保密与信息安全大赛--网络攻防 免考内容 CTF简介 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人 ...

  6. 列表与if语句的结合

    # 1.判断一个数是否是水仙花数, 水仙花数是一个三位数, 三位数的每一位的三次方的和还等于这个数. \ # 那这个数就是一个水仙花数, 例如: 153 = 1**3 + 5**3 + 3**3 # ...

  7. scrapy - Request 中的回调函数不执行

    在 scrapy 中, scrapy.Request(url, headers=self.header, callback=self.parse) 调试的时候,发现回调函数 parse_detail  ...

  8. Python3 tkinter基础 Entry insert delete 点击按钮 向输入框赋值 或 清空

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. chrome浏览器中的百度搜索引擎总是先自动跳转到百度首页怎么办?

    1.修改百度搜索引擎代码如下: http://www.baidu.com/s?wd=%s&ie={inputEncoding} 备注:现在chorme不能直接在默认的百度搜索引擎上修改,而且自 ...

  10. MySQL 5.7的原生JSON数据类型使用

    新增测试用表: CREATE TABLE lnmp ( `id` ) unsigned NOT NULL AUTO_INCREMENT, `category` JSON, `tags` JSON, P ...