软虹sdk基本使用
虹软SDK的简单使用
Java实现人脸识别,但是又不会自己实现算法,找SDK时发现了虹软。虹软SDK具有免费、识别率高等优点,然后到网上搜这个SDK的教程,没搜到,就自己探索,发现它自带的官方文档其实介绍的挺全面的,本文是由官方文档改编。
虹软SDK的激活
首先到官网注册账号,然后新建应用,然后获取到APP_ID和SDK_KEY
然后点击下载SDK,下好之后的项目结构:
|---doc
| |---ARCSOFT_ARC_FACE_JAVA_DEVELOPER'S_GUIDE.pdf 开发说明文档
|---lib
|---|---Win32/x64/linux64
| |---|---libarcsoft_face.dll 算法库
| |---|---libarcsoft_face_engine.dll 引擎库
| |---|---libarcsoft_face_engine_jni.dll 引擎库
| |---arcsoft-sdk-face-3.0.0.0.jar java依赖库
|---samplecode
| |---FaceEngineTest.java 示例代码
|---releasenotes.txt 说明文件
这里介绍的是windows版本,要将这三个.dll文件所在的文件夹添加到环境变量里面的Path里面去
再把下载的文件里面的jar包导入到项目里面去
然后就可以开始激活了
import com.arcsoft.face.FaceEngine;
import com.arcsoft.face.enums.ErrorInfo;
/**
* @author xuziao
* @date 2021/8/21 12:44
*/
public class FaceTestMd {
public void engineTest() {
String appId = "你的APP_ID";
String sdkKey = "你的SDK_KEY";
//实例化一个面部引擎
FaceEngine faceEngine = new FaceEngine();
//这个SDK几乎每一个调用引擎的操作都会返回一个int类型的结果,称为错误码,每一种错误码对应一种程序执行的结果,如果错误对应着错误类型,可以去官网查这个码对应的错误
int errorCode = faceEngine.activeOnline(appId, sdkKey);
if (errorCode != ErrorInfo.MOK.getValue() &&
errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
System.out.println("引擎激活失败:" + errorCode);
} else {
System.out.println("引擎激活成功");
}
}
public static void main(String[] args) {
new FaceTestMd().engineTest();
}
}
对引擎进行引擎配置和功能配置
package top.gostack.demo1;
import com.arcsoft.face.EngineConfiguration;
import com.arcsoft.face.FaceEngine;
import com.arcsoft.face.FunctionConfiguration;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
/**
* @author xuziao
* @date 2021/8/21 12:44
*/
public class FaceTestMd {
public void engineTest() {
String appId = "";
String sdkKey = "";
FaceEngine faceEngine = new FaceEngine();
int errorCode = faceEngine.activeOnline(appId, sdkKey);
if (errorCode != ErrorInfo.MOK.getValue() &&
errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
System.out.println("引擎激活失败:" + errorCode);
} else {
System.out.println("引擎激活成功");
}
//以下为引擎配置
EngineConfiguration engineConfiguration = new EngineConfiguration();
//设置为单张高精度识别
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
//人脸不旋转,为零度
engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
//识别的最小人脸比例 = 图片长边 / 人脸框长边的比值
engineConfiguration.setDetectFaceScaleVal(16);
//设置最多能检测的人脸数量
engineConfiguration.setDetectFaceMaxNum(10);
//以下为功能设置
final FunctionConfiguration functionConfiguration = new FunctionConfiguration();
//年龄检测
functionConfiguration.setSupportAge(true);
//启用支持人脸检测
functionConfiguration.setSupportFaceDetect(true);
//启用人脸识别
functionConfiguration.setSupportFaceRecognition(true);
//启用性别识别
functionConfiguration.setSupportGender(true);
//启用3D检测
functionConfiguration.setSupportFace3dAngle(true);
//启用RGB活体检测
functionConfiguration.setSupportLiveness(true);
//不启用IR活体检测
functionConfiguration.setSupportIRLiveness(false);
//需要防止纸张、屏幕等攻击可以传入 supportLiveness 和 supportIRLiveness, RGB 和 IR 活体检测
//将额外的设置注入到引擎中
engineConfiguration.setFunctionConfiguration(functionConfiguration);
int errorCode2 = faceEngine.init(engineConfiguration);
if (errorCode2 != ErrorInfo.MOK.getValue()) {
System.out.println("初始化引擎失败");
} else {
System.out.println("初始化引擎成功");
}
}
public static void main(String[] args) {
new FaceTestMd().engineTest();
}
}
经过以上的操作引擎初始化算是成功了,然后下面可以进行功能测试
人脸相似度比对
package top.gostack.demo1;
import com.arcsoft.face.*;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import com.arcsoft.face.toolkit.ImageInfo;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
/**
* @author xuziao
* @date 2021/8/21 12:44
*/
public class FaceTestMd {
public void engineTest() {
String appId = "";
String sdkKey = "";
FaceEngine faceEngine = new FaceEngine();
int errorCode = faceEngine.activeOnline(appId, sdkKey);
if (errorCode != ErrorInfo.MOK.getValue() &&
errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
System.out.println("引擎激活失败:" + errorCode);
} else {
System.out.println("引擎激活成功");
}
//以下为引擎配置
EngineConfiguration engineConfiguration = new EngineConfiguration();
//设置为单张高精度识别
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
//人脸不旋转,为零度
engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
//识别的最小人脸比例 = 图片长边 / 人脸框长边的比值
engineConfiguration.setDetectFaceScaleVal(16);
//设置最多能检测的人脸数量
engineConfiguration.setDetectFaceMaxNum(10);
//以下为功能设置
final FunctionConfiguration functionConfiguration = new FunctionConfiguration();
//年龄检测
functionConfiguration.setSupportAge(true);
//启用支持人脸检测
functionConfiguration.setSupportFaceDetect(true);
//启用人脸识别
functionConfiguration.setSupportFaceRecognition(true);
//启用性别识别
functionConfiguration.setSupportGender(true);
//启用3D检测
functionConfiguration.setSupportFace3dAngle(true);
//启用RGB活体检测
functionConfiguration.setSupportLiveness(true);
//不启用IR活体检测
functionConfiguration.setSupportIRLiveness(false);
//需要防止纸张、屏幕等攻击可以传入 supportLiveness 和 supportIRLiveness, RGB 和 IR 活体检测
//将额外的设置注入到引擎中
engineConfiguration.setFunctionConfiguration(functionConfiguration);
int errorCode2 = faceEngine.init(engineConfiguration);
if (errorCode2 != ErrorInfo.MOK.getValue()) {
System.out.println("初始化引擎失败");
} else {
System.out.println("初始化引擎成功");
}
String imgPath1 = "F:/Spring/SpringMVC/workplace/Ace_Face/resources/wyy1.jpg";
String imgPath2 = "F:/Spring/SpringMVC/workplace/Ace_Face/resources/wyy4.jpg";
FaceFeature faceFeature1 = getFaceFeature(imgPath1, faceEngine);
FaceFeature faceFeature2 = getFaceFeature(imgPath2, faceEngine);
//人脸相似度
FaceSimilar faceSimilar = new FaceSimilar();
int errorCode5 = faceEngine.compareFaceFeature(faceFeature1, faceFeature2, faceSimilar);
if (errorCode5 != ErrorInfo.MOK.getValue()) {
System.out.println("人脸对比操作失败!");
} else {
System.out.println("人脸对比成功!");
System.out.println("人脸相似度:" + faceSimilar.getScore());
}
}
/**
*
* @param imgPath 传入图片的地址
* @param faceEngine 传入引擎
* @return faceFeature 输出的人脸特征信息
*/
public FaceFeature getFaceFeature(String imgPath, FaceEngine faceEngine) {
//这个getRGBData方法内部调用了几个awt包里面的方法来处理图像数据,由此得到图像数据
ImageInfo imageInfo = getRGBData(new File(imgPath));
//新建一个人脸信息列表,获取到的人脸信息将储存在这个列表里面
List<FaceInfo> faceInfoList = new ArrayList<>();
//向引擎传入从图片分离的信息数据
int errorCode3 = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
imageInfo.getImageFormat(), faceInfoList);
if (errorCode3 != ErrorInfo.MOK.getValue()) {
System.out.println("数据传入失败");
} else {
System.out.println("数据传入成功");
System.out.println(faceInfoList);
}
//下面提取人脸特征
FaceFeature faceFeature = new FaceFeature();
int errorCode4 = faceEngine.extractFaceFeature(imageInfo.getImageData(),
imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(),
faceInfoList.get(0), faceFeature);
if (errorCode4 != ErrorInfo.MOK.getValue()) {
System.out.println("人脸特征提取失败!");
} else {
System.out.println("人脸特征提取成功!");
System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
}
return faceFeature;
}
public static void main(String[] args) {
new FaceTestMd().engineTest();
}
}
其余的还有年龄检测,活体检测,性别检测等等,其中在官方文档里面介绍的很清楚,我就不再一一赘述了,直接放上的测试代码和结果
我的测试代码
package top.gostack.demo1;
import com.arcsoft.face.*;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import com.arcsoft.face.toolkit.ImageInfo;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
/**
* @author xuziao
* @date 2021/8/19 19:12
*/
public class FaceTest {
public void engineTest() {
String appId = "";
String sdkKey = "";
FaceEngine faceEngine = new FaceEngine();
int errorCode = faceEngine.activeOnline(appId, sdkKey);
if (errorCode != ErrorInfo.MOK.getValue() &&
errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue())
{
System.out.println("引擎激活失败:"+errorCode);
} else {
System.out.println("引擎激活成功");
}
//以下为引擎配置
EngineConfiguration engineConfiguration = new EngineConfiguration();
//设置为单张高精度识别
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
//人脸不旋转,为零度
engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
//识别的最小人脸比例 = 图片长边 / 人脸框长边的比值
engineConfiguration.setDetectFaceScaleVal(16);
//设置最多能检测的人脸数量
engineConfiguration.setDetectFaceMaxNum(10);
//以下为功能设置
final FunctionConfiguration functionConfiguration = new FunctionConfiguration();
//年龄检测
functionConfiguration.setSupportAge(true);
//启用支持人脸检测
functionConfiguration.setSupportFaceDetect(true);
//启用人脸识别
functionConfiguration.setSupportFaceRecognition(true);
//启用性别识别
functionConfiguration.setSupportGender(true);
//启用3D检测
functionConfiguration.setSupportFace3dAngle(true);
//启用RGB活体检测
functionConfiguration.setSupportLiveness(true);
//不启用IR活体检测
functionConfiguration.setSupportIRLiveness(false);
//需要防止纸张、屏幕等攻击可以传入 supportLiveness 和 supportIRLiveness, RGB 和 IR 活体检测
//将额外的设置注入到引擎中
engineConfiguration.setFunctionConfiguration(functionConfiguration);
int errorCode2 = faceEngine.init(engineConfiguration);
if (errorCode2 != ErrorInfo.MOK.getValue()) {
System.out.println("初始化引擎失败");
} else {
System.out.println("初始化引擎成功");
}
String imgPath1 = "F:/Spring/SpringMVC/workplace/Ace_Face/resources/wyy1.jpg";
String imgPath2 = "F:/Spring/SpringMVC/workplace/Ace_Face/resources/wyy4.jpg";
FaceFeature faceFeature1 = getFaceFeature(imgPath1, faceEngine);
FaceFeature faceFeature2 = getFaceFeature(imgPath2, faceEngine);
//人脸相似度
FaceSimilar faceSimilar = new FaceSimilar();
int errorCode5 = faceEngine.compareFaceFeature(faceFeature1, faceFeature2, faceSimilar);
if (errorCode5 != ErrorInfo.MOK.getValue()) {
System.out.println("人脸对比操作失败!");
} else {
System.out.println("人脸对比成功!");
System.out.println("人脸相似度:" + faceSimilar.getScore());
}
int errorCode11 = faceEngine.unInit();
if (errorCode11 != ErrorInfo.MOK.getValue()) {
System.out.println("引擎卸载失败,错误码:");
System.out.println(errorCode);
} else {
System.out.println("引擎卸载成功!");
}
}
/**
*
* @param imgPath 传入图片的地址
* @param faceEngine 传入引擎
* @return faceFeature 输出的人脸特征信息
*/
public FaceFeature getFaceFeature(String imgPath, FaceEngine faceEngine) {
//这个getRGBData方法内部调用了几个awt包里面的方法来处理图像数据,由此得到图像数据
ImageInfo imageInfo = getRGBData(new File(imgPath));
//新建一个人脸信息列表,获取到的人脸信息将储存在这个列表里面
List<FaceInfo> faceInfoList = new ArrayList<>();
//向引擎传入从图片分离的信息数据
int errorCode3 = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(),
imageInfo.getImageFormat(), faceInfoList);
if (errorCode3 != ErrorInfo.MOK.getValue()) {
System.out.println("数据传入失败");
} else {
System.out.println("数据传入成功");
System.out.println(faceInfoList);
}
//以下实现属性提取,提取某个属性要启用相关的功能
FunctionConfiguration functionConfiguration = new FunctionConfiguration();
functionConfiguration.setSupportAge(true);
functionConfiguration.setSupportFace3dAngle(true);
functionConfiguration.setSupportGender(true);
functionConfiguration.setSupportLiveness(true);
faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(),
imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, functionConfiguration);
//下面提取属性,首先实现process接口
int errorCode6 = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(),
imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, functionConfiguration);
if (errorCode6 != ErrorInfo.MOK.getValue()) {
System.out.println("process接口调用失败,错误码:"+errorCode6);
} else {
System.out.println("process接口调用成功!");
}
//年龄检测
//创建一个存储年龄的列表
List<AgeInfo> ageInfoList = new ArrayList<>();
int errorCode7 = faceEngine.getAge(ageInfoList);
if (errorCode7 != ErrorInfo.MOK.getValue()) {
System.out.print("获取年龄失败,错误码:");
System.out.println(errorCode7);
} else {
System.out.println("年龄获取成功!");
System.out.println("年龄:" + ageInfoList.get(0).getAge());
}
//以下为性别检测
//性别检测
List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();
int errorCode8 = faceEngine.getGender(genderInfoList);
if (errorCode8 != ErrorInfo.MOK.getValue()) {
System.out.print("获取性别失败,错误码:");
System.out.println(errorCode8);
} else {
System.out.println("性别获取成功!");
System.out.println("性别:" + genderInfoList.get(0).getGender());
}
//3D信息检测
List<Face3DAngle> face3DAngleList = new ArrayList<Face3DAngle>();
int errorCode9 = faceEngine.getFace3DAngle(face3DAngleList);
if (errorCode9 != ErrorInfo.MOK.getValue()) {
System.out.println("3D信息检测失败,错误码:"+errorCode9);
} else {
System.out.println("3D信息获取成功!");
System.out.println("3D角度:" + face3DAngleList.get(0).getPitch() + "," +
face3DAngleList.get(0).getRoll() + "," + face3DAngleList.get(0).getYaw());
}
//活体检测
List<LivenessInfo> livenessInfoList = new ArrayList<LivenessInfo>();
int errorCode10 = faceEngine.getLiveness(livenessInfoList);
if (errorCode10 != ErrorInfo.MOK.getValue()) {
System.out.println("活体检测失败,错误码:"+errorCode10);
} else {
System.out.println("活体检测成功");
System.out.println("活体:" + livenessInfoList.get(0).getLiveness());
}
//下面提取人脸特征
FaceFeature faceFeature = new FaceFeature();
int errorCode4 = faceEngine.extractFaceFeature(imageInfo.getImageData(),
imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(),
faceInfoList.get(0), faceFeature);
if (errorCode4 != ErrorInfo.MOK.getValue()) {
System.out.println("人脸特征提取失败!");
} else {
System.out.println("人脸特征提取成功!");
System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
}
return faceFeature;
}
public static void main(String[] args) {
new FaceTest().engineTest();
}
}
运行结果:
引擎激活成功
初始化引擎成功
数据传入成功
[com.arcsoft.face.Rect(332, 152 - 924, 744),1]
process接口调用成功!
年龄获取成功!
年龄:21
性别获取成功!
性别:1
3D信息获取成功!
3D角度:-15.243982,21.721786,16.343493
活体检测成功
活体:1
人脸特征提取成功!
特征值大小:1032
数据传入成功
[com.arcsoft.face.Rect(345, 163 - 942, 760),1]
process接口调用成功!
年龄获取成功!
年龄:20
性别获取成功!
性别:1
3D信息获取成功!
3D角度:-11.13369,0.69471675,17.24398
活体检测成功
活体:1
人脸特征提取成功!
特征值大小:1032
人脸对比成功!
人脸相似度:0.9812902
引擎卸载成功!
最后注意,要学习这个SDK一定去看官方文档,写的很详细!
软虹sdk基本使用的更多相关文章
- Android 第三方加固方案 对比 MD
常见的第三方加固方案官网介绍 由于安卓APP是基于Java的,所以极容易被破解,一个不经过加固的APP犹如裸奔一样,毫无防备.之前曾有新闻报道,一些专职的APP打包黑产就是专门从各种渠道找到apk,通 ...
- 安卓直播开源: RTMP 推流SDK
前些日子在github上提交了基于GPUImage的IOS直播推流SDK(https://github.com/runner365/GPUImageRtmpPush) 最近整理了android直播推流 ...
- Android IOS WebRTC 音视频开发总结(八十一)-- WebRTC靠谱吗?有没有适合的SDK推荐?
作者:blaker,最早发表在我们的微信公众和[编风网],详见[这里] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn) ...
- Android中直播视频技术探究之---采集摄像头Camera视频源数据进行推流(采用金山云SDK)
一.前言 在之前已经详细介绍了Android中的一种视频数据源:Camera,不了解的同学可以点击进入:Android中Camera使用详解 ,在这篇文章中我们介绍了如何采集摄像头的每一帧数据,然后进 ...
- Android开发实例详解之IMF(Android SDK Sample—SoftKeyboard)
本博前面的文章介绍了Android开发环境的搭建和模拟器的常用操作.本次,将以Android Sample中经典的SoftKeyboard项目为例,详细解析Android上一个小型项目的开发过程和注意 ...
- 【SDK编程】
#include <stdio.h> #include <windows.h> int main() { DeleteFile("C:\\test.txt" ...
- 与众不同 windows phone (24) - Input(输入)之软键盘类型, XNA 方式启动软键盘, UIElement 的 Touch 相关事件, 触摸涂鸦
原文:与众不同 windows phone (24) - Input(输入)之软键盘类型, XNA 方式启动软键盘, UIElement 的 Touch 相关事件, 触摸涂鸦 [索引页][源码下载] ...
- LanSoEditor_common ---android平台的视频编辑SDK
当前版本是LanSoEditor-v1.4 主要使用在音视频的: 裁剪,剪切,分离,合并,转换,拼接,水印,叠加,混合,转码等场合; 我们是针对android平台对ffmpeg做了硬件加速优化,经过多 ...
- 安卓平台 全面支持软解和硬解的SDK-Demo源代码开放
专业做视频编解码的SDK开发工作. 2015年12月1日10:46:55: 更新到1.5.0版本 功能列表: 基本播放: 1,正常播放, 支持MP4,FLV,AVI,TS,3GP,RMVB,WM,WM ...
随机推荐
- cvechecker 漏洞扫描工具部署及效果展示
cvechecker 漏洞扫描工具部署及效果展示 介绍 cvechecker的目标是通过扫描已安装的软件并将结果与CVE数据库进行匹配来报告系统上可能存在的漏洞. 官方提示: 可能会产生许多误报(漏洞 ...
- JavaScript兼容性汇总
一般兼容性问都体现到DOM和事件上 只聊ie6+版本浏览器,希望小伙伴们别纠结更低版本浏览器哈^_^ DOM 获取元素 document.getElementsByclassName 不兼容ie6 ...
- 初学python-day2 字符串格式化1
- 兜底机制——leader到底做了什么?
Case 在之前一次年底考评的时候,有一位leader将一个案例同时用到了自己和下属身上,老板发出了责问: 这个项目到底你是负责人,还是你下面的同学是负责人,如果下面的同学是负责人,为什么要算到你的头 ...
- 单机CentOS 安装 TiDB
目录 一.官网教程 二.安装步骤 1.下载并安装 TiUP: 2.声明一下环境变量,否则会找不到 tiup 命令 3.安装 TiUP 的 cluster 组件: 4.官方教程说,由于模拟多机部署,需要 ...
- the Agiles Scrum Meeting 8
会议时间:2020.4.16 20:00 1.每个人的工作 今天已完成的工作 个人结对项目增量开发组:完成个人项目创建的部分功能 issues:增量组:准备评测机制,增加仓库自动创建和管理 团队项目增 ...
- js模板引擎laytpl的使用
在我们实际的开发过程中,可能会遇到使用ajax去后台获取一堆的数据,然后动态的渲染到页面上.比如:去后台获取一个list集合,然后将数据以表格的形式展示在页面上.另外一种可能发生的情况就是页面上需要批 ...
- spring security中ajax超时处理
spring security为我们的系统提供了方便的认证和授权操作.在系统中完成认证和授权后,一般页面页面上大多数是ajax和后台进行操作,那么这个时候可能就会面临session超时,ajax去访问 ...
- 轻松掌握stm32直流电机驱动与测速
说实话就现在的市场应用中stm32已经占到了绝对住到的地位,51已经成为过去式,32的功能更加强大,虽然相应的难度有所增加,但是依然阻止不了大家学习32的脚步,不说大话了这些大家都懂要不然也不会学习s ...
- 常用Java API:大数类
摘要 java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1, 对应的十进制数是9223372036854775807,也就是说只要运算过程中会超过这个数,就会造成数据溢出,从而造成错 ...