Browse Source

改造人脸登录功能

wukai 1 year ago
parent
commit
ba87a5dc79

+ 4 - 6
doc-admin/src/main/java/com/doc/web/controller/system/SysLoginController.java

@@ -15,7 +15,6 @@ import com.doc.framework.web.service.SysPermissionService;
 import com.doc.system.service.ISysMenuService;
 import com.doc.system.service.ISysUserService;
 import io.swagger.annotations.ApiOperation;
-import javafx.util.Pair;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -135,13 +134,12 @@ public class SysLoginController {
         File upFile = File.createTempFile("temp_" + filename[0], filename[1] + ".");
         file.transferTo(upFile);
 
-        Pair<Long, Float> pair = faceService.searchFaces(upFile);
-        if (pair != null && pair.getValue() > 0.75f) {
-            SysUser user = userService.selectUserById(pair.getKey());
-            AjaxResult ajax = AjaxResult.success();
+        long uid = faceService.faceLogin(upFile);
+        if (uid != 0) {
+            SysUser user = userService.selectUserById(uid);
             // 生成令牌
             String token = loginService.faceLogin(user.getUserName());
-            return AjaxResult.success("人脸识别成功,用户ID:" + pair.getKey() + "相似度:" + pair.getValue()).put(Constants.TOKEN, token);
+            return AjaxResult.success("人脸识别成功!").put(Constants.TOKEN, token);
         }
         return AjaxResult.error("未找到对应用户");
     }

+ 2 - 3
doc-admin/src/main/resources/application-dev.yml

@@ -22,11 +22,10 @@ face-engine:
   flag: true
   # 引擎库存放位置
   lib: D:\arcsoft_lib
-  app-id: D86z2YwLmGT1upsnxzGSdUKGuLyGp27VjEdPaVJepbGo
-  sdk-key: ALyL4ErWU6FrBX1GTj7UCZrtUEpgKgUYXBLT3XroMbV9
-  active-key: 086L-11C9-315C-PKCN
   # 激活文件存放位置
   active-file: D:\arcsoft_lib\086L11C9315CPKCN.dat
+  # 人脸相似度
+  score: 0.75
 
 # Spring配置
 spring:

+ 19 - 11
doc-biz/src/main/java/com/doc/face/init/FaceEngineInit.java

@@ -32,22 +32,29 @@ public class FaceEngineInit implements ApplicationListener<ContextRefreshedEvent
     @Resource
     private Environment environment;
     private FaceEngine faceEngine;
+    private Float score;
+
+    private Boolean faceEnabled;
     @Resource
     private ISysUserExpandService expandService;
 
+    /**
+     * 成功
+     */
+    private int mok = 0;
+    /**
+     * sdk已激活
+     */
+    private int alreadyActivated = 90114;
+
     private boolean initEngine() {
         String lib = environment.getProperty("face-engine.lib");
-//        String appId = environment.getProperty("face-engine.app-id");
-//        String sdkKey = environment.getProperty("face-engine.sdk-key");
-//        String activeKey = environment.getProperty("face-engine.active-key");
         String activeFile = environment.getProperty("face-engine.active-file");
-        //成功返回0
-        int errorCode = 0;
         //人脸识别引擎库存放路径
         faceEngine = new FaceEngine(lib);
         //离线激活引擎
-        errorCode = faceEngine.activeOffline(activeFile);
-        if (errorCode != 0 && errorCode != 90114) {
+        int errorCode = faceEngine.activeOffline(activeFile);
+        if (errorCode != mok && errorCode != alreadyActivated) {
             return false;
         }
         //引擎配置
@@ -85,9 +92,10 @@ public class FaceEngineInit implements ApplicationListener<ContextRefreshedEvent
     @Override
     public void onApplicationEvent(ContextRefreshedEvent event) {
         if (event.getApplicationContext().getParent() == null) {
-            boolean flag = "true".equals(environment.getProperty("face-engine.flag"));
-            log.info("SpringBoot项目加载后执行人脸识别初始化!,人脸识别开启:{}", flag);
-            if (flag) {
+            faceEnabled = "true".equals(environment.getProperty("face-engine.flag"));
+            if (faceEnabled) {
+                score = environment.getProperty("face-engine.score", Float.class);
+                log.info("SpringBoot项目加载后执行人脸识别初始化!", faceEnabled);
                 if (initEngine()) {
                     //初始化成功,注册所有人脸信息
                     register();
@@ -95,7 +103,7 @@ public class FaceEngineInit implements ApplicationListener<ContextRefreshedEvent
                     //生成激活需要的CODE
                     ActiveDeviceInfo activeDeviceInfo = new ActiveDeviceInfo();
                     //采集设备信息(可离线)
-                    int errorCode = faceEngine.getActiveDeviceInfo(activeDeviceInfo);
+                    faceEngine.getActiveDeviceInfo(activeDeviceInfo);
                     Tools.generateRegFile(activeDeviceInfo.getDeviceInfo(), "face_reg_code.txt", "人脸识别激活失败");
                     ((ConfigurableApplicationContext) event.getApplicationContext()).close();
                 }

+ 8 - 0
doc-biz/src/main/java/com/doc/face/service/IFaceService.java

@@ -25,4 +25,12 @@ public interface IFaceService {
      * @return key 用户ID value 分数
      */
     Pair<Long, Float> searchFaces(File file);
+
+    /**
+     * 使用人脸登录
+     *
+     * @param upFile 人脸图片
+     * @return 登录成功后返回用户ID,否则返回0
+     */
+    Long faceLogin(File upFile);
 }

+ 32 - 3
doc-biz/src/main/java/com/doc/face/service/impl/FaceServiceImpl.java

@@ -31,18 +31,26 @@ import java.util.List;
 public class FaceServiceImpl implements IFaceService {
     @Resource
     private FaceEngineInit faceEngineInit;
-
-    private FaceEngine faceEngine;
     @Resource
     private ISysUserExpandService expandService;
 
+    private FaceEngine faceEngine;
+    private Boolean faceEnabled;
+
+    private Float score;
+
     @PostConstruct
     public void init() {
         faceEngine = faceEngineInit.getFaceEngine();
+        faceEnabled = faceEngineInit.getFaceEnabled();
+        score = faceEngineInit.getScore();
     }
 
     @Override
     public void detectFaces(File file) {
+        if (!faceEnabled) {
+            return;
+        }
         byte[] featureData = faceFeature(file);
         if (featureData != null) {
             String feature = Base64.encode(featureData);
@@ -61,6 +69,9 @@ public class FaceServiceImpl implements IFaceService {
      * @return 特征值
      */
     private byte[] faceFeature(File file) {
+        if (!faceEnabled) {
+            return null;
+        }
         ImageInfo imageInfo = ImageFactory.getRGBData(file);
         List<FaceInfo> faceInfoList = new ArrayList<>();
         faceEngine.detectFaces(imageInfo, faceInfoList);
@@ -84,6 +95,9 @@ public class FaceServiceImpl implements IFaceService {
      */
     @Override
     public Pair<Long, Float> searchFaces(File file) {
+        if (!faceEnabled) {
+            return null;
+        }
         byte[] featureData = faceFeature(file);
         if (featureData != null) {
             FaceFeature faceFeature = new FaceFeature();
@@ -91,7 +105,6 @@ public class FaceServiceImpl implements IFaceService {
             SearchResult searchResult = new SearchResult();
             faceEngine.searchFaceFeature(faceFeature, CompareModel.LIFE_PHOTO, searchResult);
             int userId = searchResult.getFaceFeatureInfo().getSearchId();
-//            System.err.println(searchResult.getFaceFeatureInfo().getSearchId());
 
             //特征比对
             FaceSimilar faceSimilar = new FaceSimilar();
@@ -103,4 +116,20 @@ public class FaceServiceImpl implements IFaceService {
             return null;
         }
     }
+
+    /**
+     * 使用人脸登录
+     *
+     * @param upFile 人脸图片
+     * @return 登录成功后返回用户ID,否则返回0
+     */
+    @Override
+    public Long faceLogin(File upFile) {
+        Pair<Long, Float> pair = searchFaces(upFile);
+        if (pair != null && pair.getValue() > score) {
+            return pair.getKey();
+        } else {
+            return 0L;
+        }
+    }
 }