diff --git a/yq-admin/src/main/resources/application.yml b/yq-admin/src/main/resources/application.yml
index 7a0b01c..abfe029 100644
--- a/yq-admin/src/main/resources/application.yml
+++ b/yq-admin/src/main/resources/application.yml
@@ -140,3 +140,10 @@ xss:
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
+arcsoft:
+ appId: 7MtFQZ9S9Ue2UC7koYxJbeL5iEHhqGtp3d5SJbJ4ou92
+ sdkKey: 4VM5rVL8eKmmELhRi8ZoopH33GzsgPoptA94zSXyHvzz
+ faceEngine: E:\arcsoft_lib\LINUX64
+ thread-pool-size: 10
+
+
diff --git a/yq-common/pom.xml b/yq-common/pom.xml
index ef9701e..16cc9c4 100644
--- a/yq-common/pom.xml
+++ b/yq-common/pom.xml
@@ -156,7 +156,24 @@
javax.servlet
javax.servlet-api
-
+
+ com.arcsoft.face
+ arcsoft-sdk-face
+ 3.0.0.0
+ system
+ ${basedir}/libs/arcsoft-sdk-face-3.0.0.0.jar
+
-
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ true
+
+
+
+
\ No newline at end of file
diff --git a/yq-common/src/main/java/yq/common/utils/FaceEnginUtil.java b/yq-common/src/main/java/yq/common/utils/FaceEnginUtil.java
new file mode 100644
index 0000000..7533243
--- /dev/null
+++ b/yq-common/src/main/java/yq/common/utils/FaceEnginUtil.java
@@ -0,0 +1,157 @@
+package yq.common.utils;
+
+
+import cn.hutool.core.collection.CollectionUtil;
+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.enums.ImageFormat;
+import com.arcsoft.face.toolkit.ImageFactory;
+import com.arcsoft.face.toolkit.ImageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.multipart.MultipartFile;
+import yq.common.exception.ServiceException;
+import yq.common.utils.file.ImageUtils;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * minio文件上传工具类
+ * @author: jeecg-boot
+ */
+@Slf4j
+public class FaceEnginUtil {
+ @Value(value = "${arcsoft.appId}")
+ private static String appId;
+
+ @Value(value = "${arcsoft.sdkKey}")
+ private static String sdkKey;
+
+
+ @Value(value = "${arcsoft.faceEngine}")
+ private static String faceEngineUrl;
+
+
+ public static FaceEngine init() {
+ FaceEngine faceEngine = new FaceEngine(faceEngineUrl);
+ //激活引擎
+ int errorCode = faceEngine.activeOnline(appId, sdkKey);
+
+ if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
+ System.out.println("引擎激活失败");
+ }
+
+
+ ActiveFileInfo activeFileInfo=new ActiveFileInfo();
+ errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
+ if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
+ System.out.println("获取激活文件信息失败");
+ }
+
+ //引擎配置
+ EngineConfiguration engineConfiguration = new EngineConfiguration();
+ engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
+ engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
+ engineConfiguration.setDetectFaceMaxNum(10);
+ engineConfiguration.setDetectFaceScaleVal(16);
+ //功能配置
+ 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);
+
+
+ //初始化引擎
+ errorCode = faceEngine.init(engineConfiguration);
+
+ if (errorCode != ErrorInfo.MOK.getValue()) {
+ System.out.println("初始化引擎失败");
+ }
+ return faceEngine;
+ }
+
+ /**
+ * 录入人脸接口存入byte数组特征值
+ * @param file
+ * @return
+ */
+ public static byte[] uploadInput(MultipartFile file) {
+ FaceEngine faceEngine = FaceEnginUtil.init();
+ InputStream inputstream = null;
+ ImageInfo imageInfo = null;
+ try {
+ inputstream = file.getInputStream();
+ imageInfo = ImageFactory.getRGBData(inputstream);
+ if (inputstream != null) {
+ inputstream.close();
+ }
+ } catch (IOException e) {
+ throw new ServiceException("文件非图像类型");
+ }
+
+ List faceInfoList = new ArrayList();
+ faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
+ //特征提取
+ FaceFeature faceFeature = new FaceFeature();
+ faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
+ byte[] featureData = faceFeature.getFeatureData();
+ FaceEnginUtil.close(faceEngine);
+ return featureData;
+ }
+
+ /**
+ * 人脸匹配
+ * @param file 人脸数据
+ * @param faceFeature1 数据库人脸存根
+ * @return float 数据判断大于0.7以上
+ */
+ public static float uploadContrast(MultipartFile file,Byte[] faceFeature1) {
+ FaceEngine faceEngine = FaceEnginUtil.init();
+ InputStream inputstream = null;
+ ImageInfo imageInfo = null;
+ try {
+ inputstream = file.getInputStream();
+ imageInfo = ImageFactory.getRGBData(inputstream);
+ if (inputstream != null) {
+ inputstream.close();
+ }
+ } catch (IOException e) {
+ throw new ServiceException("文件非图像类型");
+ }
+
+ List faceInfoList = new ArrayList();
+ faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
+ //特征提取
+ FaceFeature faceFeature = new FaceFeature();
+ faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
+ byte[] featureData = faceFeature.getFeatureData();
+ //特征比对
+ FaceFeature targetFaceFeature = new FaceFeature();
+ targetFaceFeature.setFeatureData(featureData);
+ FaceFeature sourceFaceFeature = new FaceFeature();
+ sourceFaceFeature.setFeatureData(faceFeature.getFeatureData());
+ FaceSimilar faceSimilar = new FaceSimilar();
+ faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
+ FaceEnginUtil.close(faceEngine);
+ return faceSimilar.getScore();
+ }
+
+ public static void close(FaceEngine faceEngine) {
+ faceEngine.unInit();
+ }
+
+
+}