使用虹软ArcFac,java 离线SDK 进行人脸识别
公司项目需要人脸识别登录,需要支持离线识别,所以无法使用在线的人脸识别的API,于是使用到了离线SDK来对比识别人脸相识度.
获取人脸抓拍的图片需要对接设备,这里不做记录,假设我们已经获取到了人脸图片,只调用SDK将抓拍的人脸图片与已有的进行人脸库图片对比,具体步骤如下:
1. 注册账号,实名认证
https://ai.arcsoft.com.cn/ucenter/user/userlogin
2. 创建应用,在我的应用里面添加SDK,下载sdk到本地
3. 解压SDK,将SDK下的libs文件夹的库文件放到jdk下的lib文件夹下
4. 将SDK libs文件夹下的jar文件导入项目,然后buildpath
5. 编写测试代码,进行人脸比对
package net.nblh.faceRecognition.util.faceCompare; import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
import java.io.File;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import com.arcsoft.face.EngineConfiguration;
import com.arcsoft.face.FaceEngine;
import com.arcsoft.face.FaceFeature;
import com.arcsoft.face.FaceInfo;
import com.arcsoft.face.FaceSimilar;
import com.arcsoft.face.FunctionConfiguration;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import com.arcsoft.face.enums.ImageFormat;
import com.arcsoft.face.toolkit.ImageInfo; /** * 使用虹软SDK 进行人脸比对 * @author qxl */ public class ArcFaceCompare { /** * 初始化引擎 * @param appId * @param sdkKey * @return */ public static FaceEngine initFaceEngine(String appId,String sdkKey) { FaceEngine faceEngine = new FaceEngine(); // 激活引擎 int activeCode = faceEngine.activeOnline(appId, sdkKey); if (activeCode != ErrorInfo.MOK.getValue() && activeCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) { System.out.println("引擎激活失败"); return null; } // 引擎配置 EngineConfiguration engineConfiguration = new EngineConfiguration(); engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE); engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY); // 功能配置 FunctionConfiguration functionConfiguration = new FunctionConfiguration(); functionConfiguration.setSupportAge(true); functionConfiguration.setSupportFace3dAngle(true); functionConfiguration.setSupportFaceDetect(true); functionConfiguration.setSupportFaceRecognition(true); functionConfiguration.setSupportGender(true); functionConfiguration.setSupportLiveness(true); functionConfiguration.setSupportIRLiveness(true); engineConfiguration.setFunctionConfiguration(functionConfiguration); // 初始化引擎 int initCode = faceEngine.init(engineConfiguration); if (initCode != ErrorInfo.MOK.getValue()) { System.out.println("初始化引擎失败"); return null; } return faceEngine; } /** * 人脸图片比对 * @param faceEngine 人脸识别引擎对象 * @param picPath1 人脸图片1路径 * @param picPath2 人脸图片2路径 * @return */ public static float faceCompare(FaceEngine faceEngine,String picPath1,String picPath2) { // 人脸检测 ImageInfo imageInfo = getRGBData(new File(picPath1)); List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>(); int detectCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList); //System.out.println(faceInfoList); // 特征提取 FaceFeature faceFeature = new FaceFeature(); int extractCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList.get(0), faceFeature); //System.out.println("特征值大小:" + faceFeature.getFeatureData().length); // 人脸检测2 ImageInfo imageInfo2 = getRGBData(new File(picPath2)); List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>(); int detectCode2 = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList2); //System.out.println(faceInfoList); // 特征提取2 FaceFeature faceFeature2 = new FaceFeature(); int extractCode2 = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList2.get(0), faceFeature2); //System.out.println("特征值大小:" + faceFeature.getFeatureData().length); // 特征比对 FaceFeature targetFaceFeature = new FaceFeature(); targetFaceFeature.setFeatureData(faceFeature.getFeatureData()); FaceFeature sourceFaceFeature = new FaceFeature(); sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData()); FaceSimilar faceSimilar = new FaceSimilar(); int compareCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar); float score = faceSimilar.getScore(); BigDecimal b = new BigDecimal(score); //四舍五入,保留四位小数 float similarity =b.setScale(4,BigDecimal.ROUND_HALF_UP).floatValue(); System.out.println("相似度:" + similarity); return similarity; } /** * 卸载引擎 * @param faceEngine */ public static void uninstall(FaceEngine faceEngine) { faceEngine.unInit(); } public static void main(String[] args) { String appId = "图2创建应用的APP ID"; String sdkKey = "图2创建应用的SDK Key"; //初始化引擎 FaceEngine faceEngine = initFaceEngine(appId,sdkKey); //进行人脸比对 String picPath1 = "F:\\qxlTest\\1.jpg"; String picPath2 = "F:\\qxlTest\\9.jpg"; float similarity = faceCompare(faceEngine, picPath1, picPath2); //卸载引擎 uninstall(faceEngine); } }
6.运行main方法测试
注意事项:
A: 虹软人脸识别离线 SDK 每台机器对应一个SDK,第一次激活SDK会与机器绑定,不同的机器需要下载新的SDK
B: 离线 SDK自下载之日起,有效期一年,一年使用时间过后,需要重新下载最新版,同时更新对应的 dll文件, appid 和sdkkey,更新之后请更新以上的APP ID 和 SDK KEY
C: 具体详见官网 https://ai.arcsoft.com.cn/
使用虹软ArcFac,java 离线SDK 进行人脸识别的更多相关文章
- C# 虹软离线SDK引擎 人脸识别
一,背景 整体来说虹软的人脸识别SDK还是不错的.我们测试过Face++的,百度的,腾讯的,都是在线联网的,需要把上传数据到它们服务器,不利商业用途:虹软SDK支持离线. 二,下载虹软SDK 1.注册 ...
- C# 虹软SDK视频人脸识别和注册
一,准备工作 1.Afoge视频参数类 using AForge.Video.DirectShow; using System; using System.Collections.Generic; u ...
- Android 用虹软SDK做人脸识别
人脸识别第三方sdk比较多,但是大多都是收费的或者限制次数什么的,虹软的效果还不错,全免费也不需要联网 V1.2版本使用和快速集成:https://www.jianshu.com/p/8dee89ec ...
- java基于OpenCV的人脸识别
基于Java简单的人脸和人眼识别程序 使用这个程序之前必须先安装配置OpenCV详细教程见:https://www.cnblogs.com/prodigal-son/p/12768948.html 注 ...
- 利用Java调用OpenCV进行人脸识别
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt409 今天我准备学习如何用Java来进行人脸检测.人脸检测有助于在任何数字图 ...
- SUSE Linux Enterprise 11 离线安装 DLIB 人脸识别 python机器学习模块
python机器学习模块安装 我的博客:http://www.cnblogs.com/wglIT/p/7525046.html 环境:SUSE Linux Enterprise 11 sp4 离线安 ...
- java 虹软ArcFace 2.0,java SDK使用、人脸识别-抽取人脸特征并做比对
java人脸识别 虹软ArcFace 2.0,java SDK使用.人脸识别-抽取人脸特征并做比对 虹软产品地址:http://ai.arcsoft.com.cn/product/arcface.ht ...
- 用 Java 实现人脸识别功能(附源码)
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...
- atitit.人脸识别的应用场景and使用最佳实践 java .net php
atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景 1 2. 框架选型 JNI2OpenCV.dll and JavaCV 1 3. Url ap ...
随机推荐
- 目前流行前端几大UI框架排行榜
在前端项目开发过程中,总是会引入一些UI框架,已为方便自己的使用,很多大公司都有自己的一套UI框架,下面就是最近经常使用并且很流行的UI框架. 一.Mint UI 流行指数:★★★★ Mint UI是 ...
- C#实现通过HttpWebRequest发送POST请求实现网站自动登陆
C#实现通过HttpWebRequest发送POST请求实现网站自动登陆 怎样通过HttpWebRequest 发送 POST 请求到一个网页服务器?例如编写个程序实现自动用户登录,自动提交表单数 ...
- Centos7下的文件压缩
[root@web01 ~]# yum provides zip 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * ba ...
- 自动以读写方式挂载ntfs(新)-苹果之路
之前的mac下挂载ntfs磁盘的方法在新版本的macos下失效了:<自动以读写方式挂载ntfs-黑苹果之路>,现提供一个有效的方法,系统版本:白苹果10.14.6,参见<Mac OS ...
- OKEx交易所交易记录日期时间转毫秒级时间戳
本文介绍如何将OKEx交易所成交记录数据中的日期时间转毫秒级时间戳. 作者:比特量化 1. OKEx交易记录格式 [ { "time":"2019-09-14T10:29 ...
- k8s-job使用
一.job特性 运行完成后退出,但是不会被删除,便于用户查看日志信息,了解任务完成的情况 删除job时产生的pod也会被一起删除 job中可以运行多个pod(任务执行多次),且可以并行运行缩短任务完成 ...
- 基于C++ STL sort函数对c++ string 进行字符串的局部排序
Paypal笔试挂了,因为好久没有在leedcode之类的网上写代码,字符输入调了半天,时间都用光了.... Description: 有一个字符串,现在对其进行多次局部排序,例如str=" ...
- 《ucore lab1 exercise5》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_s ...
- mysql慢查询及查询优化
mysql默认是没有开启慢查询的 1 查看慢查询的配置状态 show variables like 'slow_query%'; slow_query_log 慢查询开启状态 slow_query_l ...
- 032 SSM综合练习08--数据后台管理系统--jsp页面显示当前用户名
1. 页面端标签控制权限 在jsp页面中我们可以使用spring security提供的权限标签来进行权限控制. (1)在pom文件中导入依赖 <dependency> <group ...