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(); + } + + +}