车车 7 ay önce
ebeveyn
işleme
6e341ba1c3

+ 4 - 3
ktg-admin/pom.xml

@@ -18,11 +18,12 @@
     <dependencies>
 
         <!-- spring-boot-devtools -->
-        <dependency>
+        <!-- 表示依赖不会传递 -->
+        <!--<dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-devtools</artifactId>
-            <optional>true</optional> <!-- 表示依赖不会传递 -->
-        </dependency>
+            <optional>true</optional>
+        </dependency>-->
 
         <!-- swagger3-->
         <dependency>

+ 8 - 0
ktg-admin/src/main/java/com/ktg/web/controller/iscs/SysTeamController.java

@@ -117,4 +117,12 @@ public class SysTeamController extends BaseController
         boolean b = sysTeamService.removeByIds(Arrays.asList(ids));
         return CommonResult.success(b);
     }
+
+    @ApiOperation("测试")
+    @GetMapping("/testaaaaaaaa")
+    public CommonResult<Boolean> testaaaaaaaa()
+    {
+        return CommonResult.success(true);
+    }
+
 }

+ 9 - 1
ktg-admin/src/main/java/com/ktg/web/controller/system/SysLoginController.java

@@ -117,7 +117,15 @@ public class SysLoginController {
     @ApiOperation("系统用户登录-指纹验证登录dat")
     @PostMapping("/loginByFingerprintDat")
     public AjaxResult loginByFingerprintDat(MultipartFile file) throws IOException {
-        AjaxResult ajaxResult = loginService.loginByFingerprintDat(file);
+        // AjaxResult ajaxResult = loginService.loginByFingerprintDat(file);
+        AjaxResult ajaxResult = loginService.loginByFace(file);
+        return ajaxResult;
+    }
+
+    @ApiOperation("系统用户登录-face登录")
+    @PostMapping("/loginByFace")
+    public AjaxResult loginByFace(MultipartFile file) throws IOException {
+        AjaxResult ajaxResult = loginService.loginByFace(file);
         return ajaxResult;
     }
 }

+ 3 - 3
ktg-admin/src/main/java/com/ktg/web/controller/system/SysUserCharacteristicController.java

@@ -89,7 +89,7 @@ public class SysUserCharacteristicController extends BaseController
     // @PreAuthorize("@ss.hasPermi('iscs:characteristic:add')")
     @Log(title = "新增指纹录入-指纹图片转成dat存储", businessType = BusinessType.INSERT)
     @PostMapping("/insertUserFingerprintDat")
-    public CommonResult<Boolean> insertUserFingerprintDat(MultipartFile file, String userName) throws IOException {
+    public CommonResult<FaceCutVO> insertUserFingerprintDat(MultipartFile file, String userName) throws IOException {
         IsSystemAttribute one = isSystemAttributeService.getOne(Wrappers.<IsSystemAttribute>lambdaQuery()
                 .eq(IsSystemAttribute::getSysAttrKey, "sys.fingerprint.limit"));
         String sysAttrValue = null;
@@ -97,8 +97,8 @@ public class SysUserCharacteristicController extends BaseController
             sysAttrValue = one.getSysAttrValue();
         }
         String url = serverConfig.getUrl();
-        return CommonResult.success(sysUserCharacteristicService.insertUserFingerprintDat(file, userName, sysAttrValue, url));
-        // return CommonResult.success(sysUserCharacteristicService.insertUserCutFace(file, userName, sysAttrValue, url));
+        // return CommonResult.success(sysUserCharacteristicService.insertUserFingerprintDat(file, userName, sysAttrValue, url));
+        return CommonResult.success(sysUserCharacteristicService.insertUserCutFace(file, userName, sysAttrValue, url));
     }
     @ApiOperation("修改用户特征(指纹、面部)")
     @PreAuthorize("@ss.hasPermi('iscs:characteristic:edit')")

+ 1 - 1
ktg-common/pom.xml

@@ -209,7 +209,7 @@
         <dependency>
             <groupId>org.openpnp</groupId>
             <artifactId>opencv</artifactId>
-            <version>4.6.0-0</version>
+            <version>4.7.0-0</version>
         </dependency>
 
     </dependencies>

+ 2 - 10
ktg-common/src/main/java/com/ktg/common/utils/face/FaceCutUtil.java

@@ -27,9 +27,6 @@ public class FaceCutUtil
     @Value("${ktg-mes.prod}")
     private static String prodApi;
 
-    public static void main(String[] args) throws IOException {
-        imageFaceDetection(null, 1L, null);
-    }
 
     // 初始化人脸探测器
     static CascadeClassifier faceDetector;
@@ -44,17 +41,12 @@ public class FaceCutUtil
             loadPath = "C:/work/app/install/opencv/build/java/x64/opencv_java470.dll";
         }
         System.load(loadPath);
-        // System.loadLibrary("C:/work/app/install/opencv/build/java/opencv-460.jar");
         // 从配置文件lbpcascade_frontalface.xml中创建一个人脸识别器,文件位于opencv安装目录中
         String faceDetectorPath = "/guoruan/app/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";
         if (StringUtils.isBlank(prodApi)) {
             faceDetectorPath = "C:/work/app/install/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";
-            // faceDetectorPath = "C:\\work\\app\\install\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
         }
-        // CascadeClassifier faceDetector = new CascadeClassifier(faceDetectorPath);
-        String property = "C:/work/app/install/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";
-        System.out.println(property);
-        faceDetector = new CascadeClassifier(property);
+        CascadeClassifier faceDetector = new CascadeClassifier(faceDetectorPath);
 
         // -------------------- 定义文件的基础属性----------------------------
         // 人脸存储基础路径
@@ -114,7 +106,7 @@ public class FaceCutUtil
         for (Rect rect : face.toArray()) {
             Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0), 3);
             // 进行图片裁剪
-            String cutImgName = userId + "_cut_" + currentTimestamp + ".jpg";
+            String cutImgName = userId + "_" + currentTimestamp + "_cut.jpg";
             content = filePath + cutImgName;
             imageCut(imagePath, content, rect.x, rect.y, rect.width, rect.height);
             // i++;

+ 19 - 8
ktg-common/src/main/java/com/ktg/common/utils/face/FaceMatchUtil.java

@@ -2,6 +2,7 @@ package com.ktg.common.utils.face;
 
 
 import com.ktg.common.utils.StringUtils;
+import com.ktg.common.vo.FaceMatchVO;
 import org.opencv.core.*;
 import org.opencv.imgcodecs.Imgcodecs;
 import org.opencv.imgproc.Imgproc;
@@ -9,6 +10,7 @@ import org.opencv.objdetect.CascadeClassifier;
 import org.springframework.beans.factory.annotation.Value;
 
 import java.util.Arrays;
+import java.util.Set;
 
 /**
  * 面部对比工具
@@ -26,9 +28,9 @@ public class FaceMatchUtil
     static {
         // 加载OpenCV本地库
         // System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
-        String loadPath = "/guoruan/app/opencv/build/java/x64/opencv_java460.dll";
+        String loadPath = "/guoruan/app/opencv/build/java/x64/opencv_java470.dll";
         if (StringUtils.isBlank(prodApi)) {
-            loadPath = "C:/work/app/install/opencv/build/java/x64/opencv_java460.dll";
+            loadPath = "C:/work/app/install/opencv/build/java/x64/opencv_java470.dll";
         }
         System.load(loadPath);
         // 从配置文件lbpcascade_frontalface.xml中创建一个人脸识别器,文件位于opencv安装目录中
@@ -39,7 +41,7 @@ public class FaceMatchUtil
         faceDetector = new CascadeClassifier(faceDetectorPath);
     }
 
-    public static void main(String[] args) {
+   /* public static void main(String[] args) {
         double comparison = faceRecognitionComparison("C:/work/file/11.jpg", "C:/work/file/13.jpg");
         System.out.println("对比结果:" + comparison);
         if (comparison > 0.85) {
@@ -57,15 +59,15 @@ public class FaceMatchUtil
         }
         // 终止当前运行的 Java 虚拟机。
         System.exit(0);
-    }
+    }*/
 
 
     /**
      * 人脸识别比对
      */
-    public static double faceRecognitionComparison(String image1, String image2) {
+    public static FaceMatchVO faceRecognitionComparison(String image1, Set<String> image2) {
         Mat mat1 = conv_Mat(image1);
-        Mat mat2 = conv_Mat(image2);
+
         Mat mat3 = new Mat();
         Mat mat4 = new Mat();
         // 颜色范围
@@ -74,10 +76,19 @@ public class FaceMatchUtil
         MatOfInt histSize = new MatOfInt(1000);
 
         Imgproc.calcHist(Arrays.asList(mat1), new MatOfInt(0), new Mat(), mat3, histSize, ranges);
-        Imgproc.calcHist(Arrays.asList(mat2), new MatOfInt(0), new Mat(), mat4, histSize, ranges);
 
         // 比较两个密集或两个稀疏直方图
-        return Imgproc.compareHist(mat3, mat4, Imgproc.CV_COMP_CORREL);
+        for (String s : image2) {
+            Mat mat2 = conv_Mat(s);
+            Imgproc.calcHist(Arrays.asList(mat2), new MatOfInt(0), new Mat(), mat4, histSize, ranges);
+            double v = Imgproc.compareHist(mat3, mat4, Imgproc.CV_COMP_CORREL);
+            System.out.println("匹配人脸:" + s + ",分数:" + v);
+            if (v > 0.80) {
+                System.out.println("匹配到了合适的人脸信息,人脸照片" + s + ",人脸分数" + v);
+                return new FaceMatchVO().setContent(s).setScore(v);
+            }
+        }
+        return null;
     }
 
     /**

+ 27 - 0
ktg-common/src/main/java/com/ktg/common/vo/FaceMatchVO.java

@@ -0,0 +1,27 @@
+package com.ktg.common.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@EqualsAndHashCode(callSuper = false)
+@Data
+@Accessors(chain = true)
+public class FaceMatchVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "人员编号")
+    private Long userId;
+
+    @ApiModelProperty(value = "内容")
+    private String content;
+
+    @ApiModelProperty(value = "得分")
+    private Double score;
+
+}
+

+ 65 - 1
ktg-framework/src/main/java/com/ktg/framework/web/service/SysLoginService.java

@@ -14,7 +14,11 @@ import com.ktg.common.exception.user.CaptchaException;
 import com.ktg.common.exception.user.CaptchaExpireException;
 import com.ktg.common.exception.user.UserPasswordNotMatchException;
 import com.ktg.common.utils.*;
+import com.ktg.common.utils.face.FaceCutUtil;
+import com.ktg.common.utils.face.FaceMatchUtil;
 import com.ktg.common.utils.ip.IpUtils;
+import com.ktg.common.vo.FaceCutVO;
+import com.ktg.common.vo.FaceMatchVO;
 import com.ktg.common.vo.VerificationVO;
 import com.ktg.framework.manager.AsyncManager;
 import com.ktg.framework.manager.factory.AsyncFactory;
@@ -25,6 +29,7 @@ import com.ktg.system.service.ISysUserOnlineService;
 import com.ktg.system.service.ISysUserService;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.authentication.AuthenticationManager;
@@ -38,6 +43,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.io.File;
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.List;
@@ -48,6 +54,7 @@ import java.util.stream.Collectors;
  *
  * @author guoruan
  */
+@Slf4j
 @Component
 public class SysLoginService {
     @Autowired
@@ -231,7 +238,6 @@ public class SysLoginService {
         List<String> collect = list.stream().map(SysUserCharacteristic::getContent).collect(Collectors.toList());
         // 通过指纹获取最相似的用户
         VerificationVO verificationVO = FingerprintComparisonByDat.completableFutureComparison(file, new HashSet<>(collect));
-        // VerificationVO verificationVO = FingerprintComparisonByDat.completableFutureComparison(file, collect);
         Assert.notNull(verificationVO, "无法根据指纹确定您的身份,请通过其它方式登录!");
         String fingerprint = verificationVO.getFingerprint();
         SysUserCharacteristic one = iSysUserCharacteristicService.getOne(Wrappers.<SysUserCharacteristic>lambdaQuery()
@@ -246,5 +252,63 @@ public class SysLoginService {
         return ajax;
     }
 
+    public AjaxResult loginByFace(MultipartFile file) throws IOException {
+        Assert.isTrue(file.getSize() > 0, "输入的人脸不能为空!");
+        // 获取所有的用户人脸
+        List<SysUserCharacteristic> list = iSysUserCharacteristicService.list(Wrappers.<SysUserCharacteristic>lambdaQuery()
+                .eq(SysUserCharacteristic::getType, "2"));
+        Assert.isFalse(list.isEmpty(), "人脸库中暂无您的人脸信息!");
+        List<String> collect = list.stream().map(SysUserCharacteristic::getContent).collect(Collectors.toList());
+        // 通过人脸获取最相似的用户
+
+
+        // 记录开始时间
+        long startTime = System.currentTimeMillis();
+        FaceCutVO faceCutVO = FaceCutUtil.imageFaceDetection(file, 0L, null);
+
+        // 记录结束时间
+        long endTime = System.currentTimeMillis();
+        // 计算时间差(毫秒)
+        long duration = endTime - startTime;
+        System.out.println("Execution time in milliseconds: " + duration);
+
+
+        // 记录开始时间
+        long startTime1 = System.currentTimeMillis();
+        FaceMatchVO faceMatchVO = FaceMatchUtil.faceRecognitionComparison(faceCutVO.getContent(), new HashSet<>(collect));
+
+        // 记录结束时间
+        long endTime1 = System.currentTimeMillis();
+        // 计算时间差(毫秒)
+        long duration1 = endTime1 - startTime1;
+        System.out.println("Execution time in milliseconds: " + duration);
+
+
+
+        // 删除刚刚上传的文件信息
+        File file1 = new File(faceCutVO.getContent());
+        if (!file1.delete()) {
+            log.error("面部临时裁剪文件删除失败: " + faceCutVO.getContent());
+        }
+        File file2 = new File(faceCutVO.getImagePath());
+        if (!file2.delete()) {
+            log.error("img文件删除失败: " + faceCutVO.getImagePath());
+        }
+        Assert.notNull(faceMatchVO, "无法根据人脸确定您的身份,请通过其它方式登录!");
+        String okFace = faceMatchVO.getContent();
+        SysUserCharacteristic one = iSysUserCharacteristicService.getOne(Wrappers.<SysUserCharacteristic>lambdaQuery()
+                .eq(SysUserCharacteristic::getContent, okFace)
+                .last("limit 1"));
+        SysUser sysUser = iSysUserService.getById(one.getUserId());
+        // 生成令牌
+        AjaxResult ajax = AjaxResult.success();
+        String token = loginWithoutPassword(sysUser);
+        ajax.put(Constants.TOKEN, token);
+        ajax.put("nickName", sysUser.getNickName());
+        return ajax;
+    }
+
+
+
 
 }

+ 8 - 0
ktg-system/src/main/java/com/ktg/system/service/impl/SysUserCharacteristicServiceImpl.java

@@ -159,6 +159,14 @@ public class SysUserCharacteristicServiceImpl extends ServiceImpl<SysUserCharact
             Assert.isFalse(count >= i, "该人员的人脸录入已上限,最大"+ i + "条!");
         }
         FaceCutVO faceCutVO = FaceCutUtil.imageFaceDetection(file, userId, url);
+        SysUserCharacteristic sysUserCharacteristic = new SysUserCharacteristic();
+        sysUserCharacteristic.setUserId(userId);
+        sysUserCharacteristic.setType("2");
+        sysUserCharacteristic.setContent(faceCutVO.getContent());
+        sysUserCharacteristic.setOrderNum(0);
+        sysUserCharacteristic.setImageUrl(faceCutVO.getImageUrl());
+        sysUserCharacteristic.setImagePath(faceCutVO.getImagePath());
+        save(sysUserCharacteristic);
         return faceCutVO;
     }