springboot虹软人脸识别集成

2024-01-10 16:12

本文主要是介绍springboot虹软人脸识别集成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

准备工作

在这里插入图片描述
虹软开放平台中创建一个新的应用 虹软开发平台【点我跳转】

开始上代码

基本配置

在这里插入图片描述
将下载的jar包放到src同级目录下

 <!--        虹软--><dependency><groupId>com.arcsoft.face</groupId><artifactId>arcsoft-sdk-face</artifactId><version>3.0.0.0</version><scope>system</scope><systemPath>${basedir}/libs/arcsoft-sdk-face-3.0.0.0.jar</systemPath></dependency><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 加入下面这一行 --><includeSystemScope>true</includeSystemScope></configuration><version>2.3.4.RELEASE</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin>

配置类初始化

@Data
@Configuration
@ConfigurationProperties(prefix = "arcsoft")
public class ArcSoftConfig {private String appid;// win平台sdk 此处为了开发时调试 生产一般linux 不需要此设置private String winsdkkey;// linux平台sdk private String linuxsdkkey;// dll/so库路径private String libpath;/*** 装载FaceEngine交给spring托管* * @return*/@Beanpublic FaceEngine faceEngine() {String sdkkey = "";String os = System.getProperty("os.name");if (os.toLowerCase().startsWith("win")) {sdkkey = winsdkkey;String projectPath = System.getProperty("user.dir");libpath = projectPath + "\\libs\\WIN64";} else {sdkkey = linuxsdkkey;}FaceEngine faceEngine = new FaceEngine(libpath);int errorCode = faceEngine.activeOnline(appid, sdkkey);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {throw new RuntimeException("引擎注册失败");}EngineConfiguration engineConfiguration = getFaceEngineConfiguration();// 初始化引擎errorCode = faceEngine.init(engineConfiguration);if (errorCode != ErrorInfo.MOK.getValue()) {throw new RuntimeException("初始化引擎失败");}return faceEngine;}/*** 初始化引擎配置* * @return*/private EngineConfiguration getFaceEngineConfiguration() {EngineConfiguration engineConfiguration = new EngineConfiguration();// 配置引擎模式if ("IMAGE".equals(EngineConfigurationProperty.DETECT_MODE)) {engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);} else {engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_VIDEO);}// 配置人脸角度 全角度 ASF_OP_ALL_OUT 不够准确且检测速度慢switch (EngineConfigurationProperty.DETECT_FACE_ORIENT_PRIORITY) {case "ASF_OP_0_ONLY":engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);break;case "ASF_OP_90_ONLY":engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_90_ONLY);break;case "ASF_OP_270_ONLY":engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_270_ONLY);break;case "ASF_OP_180_ONLY":engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_180_ONLY);break;case "ASF_OP_ALL_OUT":engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);break;default:engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);}// 设置识别的最小人脸比engineConfiguration.setDetectFaceScaleVal(EngineConfigurationProperty.DETECT_FACE_SCALE);engineConfiguration.setDetectFaceMaxNum(EngineConfigurationProperty.DETECT_FACE_MAX_NUM);// 功能配置initFuncConfiguration(engineConfiguration);return engineConfiguration;}/*** 功能配置* * @param engineConfiguration*/private void initFuncConfiguration(EngineConfiguration engineConfiguration) {FunctionConfiguration functionConfiguration = new FunctionConfiguration();// 是否支持年龄检测functionConfiguration.setSupportAge(FunConfigurationProperty.SUPPORT_AGE);// 是否支持3d 检测functionConfiguration.setSupportFace3dAngle(FunConfigurationProperty.SUPPORT_FACE_3D_ANGLE);// 是否支持人脸检测functionConfiguration.setSupportFaceDetect(FunConfigurationProperty.SUPPORT_FACE_DETECT);// 是否支持人脸识别functionConfiguration.setSupportFaceRecognition(FunConfigurationProperty.SUPPORT_FACE_RECOGNITION);// 是否支持性别检测functionConfiguration.setSupportGender(FunConfigurationProperty.SUPPORT_GENDER);// 是否支持活体检测functionConfiguration.setSupportLiveness(FunConfigurationProperty.SUPPORT_LIVENESS);// 是否支持IR活体检测functionConfiguration.setSupportIRLiveness(FunConfigurationProperty.SUPPORT_IR_LIVENESS);engineConfiguration.setFunctionConfiguration(functionConfiguration);}
}

yml配置文件
在这里插入图片描述

其他配置

引擎类

public class EngineConfigurationProperty {/*** 引擎模式*/public static final String DETECT_MODE = "IMAGE";/*** 配置人脸角度*/public static final String DETECT_FACE_ORIENT_PRIORITY = "ASF_OP_ALL_OUT";/*** 设置识别的最小人脸比*/public static final Integer DETECT_FACE_SCALE = 32;/*** 最大检测人脸数*/public static final Integer DETECT_FACE_MAX_NUM = 8;
}

功能类

public class FunConfigurationProperty {/*** 是否支持3d 检测*/public static final Boolean SUPPORT_FACE_3D_ANGLE = true;/*** 是否支持人脸检测*/public static final Boolean SUPPORT_FACE_DETECT = true;/*** 是否支持人脸识别*/public static final Boolean SUPPORT_FACE_RECOGNITION = true;/*** 性别检测*/public static final Boolean SUPPORT_GENDER = true;/*** 年龄检测*/public static final Boolean SUPPORT_AGE = true;/*** 是否支持活体检测*/public static final Boolean SUPPORT_LIVENESS = true;/*** 是否至此IR活体检测*/public static final Boolean SUPPORT_IR_LIVENESS = true;
}

人脸相关方法

@Component
public class ArcFaceMothodUtils {@Autowiredprivate FaceEngine faceEngine;/*** 人脸检测*/public List<FaceInfo> detectFace(ImageInfoEx imageInfoEx) {if (imageInfoEx == null) {return null;}List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();int i = faceEngine.detectFaces(imageInfoEx, DetectModel.ASF_DETECT_MODEL_RGB, faceInfoList);checkEngineResult(i, ErrorInfo.MOK.getValue(), "人脸检测失败");return faceInfoList;}/*** 特征提取*/public FaceFeature extractFaceFeature(List<FaceInfo> faceInfoList, ImageInfoEx imageInfoEx) {if (faceInfoList == null || imageInfoEx == null) {return null;}FaceFeature faceFeature = new FaceFeature();int i = faceEngine.extractFaceFeature(imageInfoEx, faceInfoList.get(0), faceFeature);checkEngineResult(i, ErrorInfo.MOK.getValue(), "人脸特征提取失败");return faceFeature;}/*** 特征比对*/public FaceSimilar compareFaceFeature(FaceFeature target, FaceFeature source, CompareModel compareModel) {FaceSimilar faceSimilar = new FaceSimilar();int i = faceEngine.compareFaceFeature(target, source, compareModel, faceSimilar);checkEngineResult(i, ErrorInfo.MOK.getValue(), "人脸特征对比失败");return faceSimilar;}/*** 错误检测*/private void checkEngineResult(int errorCode, int sourceCode, String errMsg) {if (errorCode != sourceCode) {throw new RuntimeException(errMsg);}}
}

虹软图片处理工具类

@Slf4j
public class ArcfaceUtils {/*** 处理 File 的图片流* * @param img* @return*/public static ImageInfoMeta packImageInfoEx(File img) {ImageInfo imageInfo = ImageFactory.getRGBData(img);return packImageInfoMeta(imageInfo);}/*** 处理 byte[] 的图片流* * @param img* @return*/public static ImageInfoMeta packImageInfoMeta(byte[] img) {ImageInfo imageInfo = ImageFactory.getRGBData(img);return packImageInfoMeta(imageInfo);}/*** 处理 InpuStream 的图片流* * @param img* @return*/public static ImageInfoMeta packImageInfoMeta(InputStream img) {ImageInfo imageInfo = ImageFactory.getRGBData(img);return packImageInfoMeta(imageInfo);}/*** 处理 网络图片 的图片流** @param path* @return*/public static ImageInfoMeta packImageInfoURL(String path) {try {InputStream inputStream = getImageInputStream(path);ImageInfo imageInfo = ImageFactory.getRGBData(inputStream);return packImageInfoMeta(imageInfo);} catch (Exception e) {log.error("处理网络图片处理失败", e);}return null;}/*** 处理 base图片 的图片流** @param base64* @return*/public static ImageInfoMeta packImageInfoBase64(String base64) {try {ImageInfo imageInfo = ImageFactory.getRGBData(removeBase64Prefix(base64));return packImageInfoMeta(imageInfo);} catch (Exception e) {log.error("处理网络图片处理失败", e);}return null;}public static byte[] removeBase64Prefix(String base64String) {if (base64String.startsWith("data:image/jpeg;base64,")) {base64String = base64String.replace("data:image/jpeg;base64,", "");}if (base64String.startsWith("data:image/png;base64,")) {base64String = base64String.replace("data:image/png;base64,", "");}return Base64.getDecoder().decode(base64String);}public static InputStream getImageInputStream(String imageUrl) throws Exception {URL url = new URL(imageUrl);URLConnection connection = url.openConnection();return connection.getInputStream();}/*** 打包生成 ImageInfoMeta* * @param imageInfo* @return*/private static ImageInfoMeta packImageInfoMeta(ImageInfo imageInfo) {ImageInfoMeta imageInfoMeta = new ImageInfoMeta(imageInfo);return imageInfoMeta;}/*** 对imageInfo 和 imageInfoEx 的打包对象* * @return*/@Datapublic static class ImageInfoMeta {private ImageInfo imageInfo;private ImageInfoEx imageInfoEx;public ImageInfoMeta(ImageInfo imageInfo) {this.imageInfo = imageInfo;imageInfoEx = new ImageInfoEx();imageInfoEx.setHeight(imageInfo.getHeight());imageInfoEx.setWidth(imageInfo.getWidth());imageInfoEx.setImageFormat(imageInfo.getImageFormat());imageInfoEx.setImageDataPlanes(new byte[][] { imageInfo.getImageData() });imageInfoEx.setImageStrides(new int[] { imageInfo.getWidth() * 3 });}}}

实际业务使用

        // 开始使用虹软人脸识别ArcfaceUtils.ImageInfoMeta imageInfoMeta1 = ArcfaceUtils.packImageInfoURL(photo);if (null == imageInfoMeta1) {throw new ValidatorException("您的人脸信息在系统内已失效请重新录入");}// 系统的人脸库信息List<FaceInfo> faceInfo1 = arcFaceMothodUtils.detectFace(imageInfoMeta1.getImageInfoEx());FaceFeature faceFeature1 = arcFaceMothodUtils.extractFaceFeature(faceInfo1, imageInfoMeta1.getImageInfoEx());// 当前需要对比的人脸ArcfaceUtils.ImageInfoMeta imageInfoMeta2 = ArcfaceUtils.packImageInfoBase64(dto.getFacePic());if (null == imageInfoMeta2) {throw new ValidatorException("您的人脸信息人脸特征提取失败,请重试");}List<FaceInfo> faceInfo2 = arcFaceMothodUtils.detectFace(imageInfoMeta2.getImageInfoEx());FaceFeature faceFeature2 = arcFaceMothodUtils.extractFaceFeature(faceInfo2, imageInfoMeta2.getImageInfoEx());FaceSimilar faceSimilar = arcFaceMothodUtils.compareFaceFeature(faceFeature1, faceFeature2,CompareModel.LIFE_PHOTO);// 相似度float score = faceSimilar.getScore();log.info("当前匹配的身份证信息【{}】,相似度:{}", dto.getUserId(), score);

希望对大家能够有所帮助 仅作为个人笔记使用

这篇关于springboot虹软人脸识别集成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591356

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏