suntianwu 3 anni fa
parent
commit
b89fd4c916

+ 6 - 6
src/main/java/com/iden/bms/controller/TraceController.java

@@ -45,8 +45,8 @@ public class TraceController {
     public Result<String> uploadImage( @ApiParam(value="图像",required=true) MultipartFile file,
                                        @RequestHeader(name = "token") String token) {
         try {
-            String imageCode = traceService.uploadImage(file);
-            return  Result.success("上传成功!",imageCode);
+            String image = traceService.uploadImage(file);
+            return  Result.success("上传成功!",image);
         } catch (BDException e) {
             log.error("图像上传出现异常",e);
             return Result.error(e.getMessage());
@@ -60,18 +60,18 @@ public class TraceController {
     @GetMapping("/listTrace")
     @ApiOperation(value = "目标轨迹列表,地图打点划线 ")
     @ApiImplicitParams(value = {
-            @ApiImplicitParam(paramType = "query", name = "imageCodes", value = "图像编码,多个用逗号分割"),
+            @ApiImplicitParam(paramType = "query", name = "images", value = "图像名称,多个用逗号分割"),
             @ApiImplicitParam(paramType = "query", name = "beginTime", value = "开始时间(yyyy-MM-dd HH:mm:ss)"),
             @ApiImplicitParam(paramType = "query", name = "endTime", value = "结束时间(yyyy-MM-dd HH:mm:ss)")
 
     })
-    public Result<List<TraceVO>> listTrace(HttpServletRequest request, @RequestHeader(value = "token") String token,
-                                           @RequestParam(value = "imageCodes", required = true) String imageCodes,
+    public Result<List<TraceVO>> listUploadImagesTrace(HttpServletRequest request, @RequestHeader(value = "token") String token,
+                                           @RequestParam(value = "images", required = true) String images,
                                            @RequestParam(value = "beginTime", required = false) String beginTime,
                                            @RequestParam(value = "endTime", required = false) String endTime){
         try {
             UserLogindConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
-            List<TraceVO> datas = this.traceService.listTrace(imageCodes,beginTime,endTime,loginUser);
+            List<TraceVO> datas = this.traceService.listUploadImagesTrace(images,beginTime,endTime,loginUser);
             return Result.success(datas);
         }catch (Exception e) {
             log.error("轨迹管理: 目标轨迹列表查询出现异常",e);

+ 2 - 2
src/main/java/com/iden/bms/face/FaceIdenService.java

@@ -64,7 +64,7 @@ public class FaceIdenService {
     public void handleCameraImage() throws Exception {
         logger.info("FaceIdenService.handleCameraImage start...");
 
-        File originImageDirFile = new File(idenRoot + "data/origin/image");
+        File originImageDirFile = new File(idenRoot + "data/origin/camera/image");
 
         //使用摄像头编码做目录名,里面图像或视频的名称上加上拍照时间,
         // 比如  20211217123023.jpg     20211217123023~20211217123323.mp4
@@ -73,7 +73,7 @@ public class FaceIdenService {
             if(cameraCodeDirs != null && cameraCodeDirs.length > 0){
 
                 //初始化引擎,加载人员图像人脸特征库
-                String personImageDir = idenRoot + "data/final/image/person";
+                String personImageDir = idenRoot + "data/final/person";
                 File[] imgPersonFiles = new File(personImageDir).listFiles();
                 FaceMonitor faceMonitorPerson = FaceIdenTool.initFaceMonitor(idenRoot,imgPersonFiles);
 

+ 26 - 7
src/main/java/com/iden/bms/face/FaceIdenTool.java

@@ -28,18 +28,24 @@ public class FaceIdenTool {
         faceMonitor.init(idenRoot + "face/model", 0);
 
         List<byte[]> faceTestImageList = new ArrayList<>();
-        for(File imgFile : imgFiles) {
-            faceTestImageList.add(readFileBytes(imgFile.getAbsolutePath()));
+        if(imgFiles != null && imgFiles.length > 0){
+            for(File imgFile : imgFiles) {
+                if(imgFile!= null && imgFile.isFile())
+                faceTestImageList.add(readFileBytes(imgFile.getAbsolutePath()));
+            }
         }
+
         FaceModel[] faceModels = faceMonitor.extractFeature(faceTestImageList);
         //加载人脸特征库
-        faceMonitor.loadFaceDataset(faceModels);
+        if (faceModels != null && faceModels.length > 0){
+            faceMonitor.loadFaceDataset(faceModels);
+        }
 
         return faceMonitor;
     }
 
     /**
-     * 批量获取人脸特征码
+     * 批量获取人脸特征码结构体
      * @param idenRoot
      * @param imgFiles
      * @return
@@ -50,8 +56,10 @@ public class FaceIdenTool {
         faceMonitor.init(idenRoot + "face/model", 0);
 
         List<byte[]> faceTestImageList = new ArrayList<>();
-        for(File imgFile : imgFiles) {
-            faceTestImageList.add(readFileBytes(imgFile.getAbsolutePath()));
+        if(imgFiles != null && imgFiles.length > 0){
+            for(File imgFile : imgFiles) {
+                faceTestImageList.add(readFileBytes(imgFile.getAbsolutePath()));
+            }
         }
         FaceModel[] faceModels = faceMonitor.extractFeature(faceTestImageList);
         //释放人脸引擎
@@ -60,8 +68,16 @@ public class FaceIdenTool {
     }
 
 
-    //得到单个特征码
+    /**
+     * 得到单个特征码
+     * @param idenRoot
+     * @param imgFile
+     * @return
+     */
     public static String getFeatPtr(String idenRoot, File imgFile) {
+        if(imgFile == null || !imgFile.isFile()){
+            return null;
+        }
         File[] imgFiles = new File[]{imgFile};
         FaceModel[] faceModels = extractFeature(idenRoot,imgFiles);
 
@@ -82,6 +98,9 @@ public class FaceIdenTool {
      * @return
      */
     public static int getHitIndex(FaceMonitor faceMonitor, FaceModel faceModel) {
+        if (faceMonitor == null){
+            return -1;
+        }
         FaceRecogRetrieveResult faceRecogRetrieveResult = faceMonitor.faceRecogRetrieveFaceDataset(faceModel);
         if(faceRecogRetrieveResult != null) {
             int index = faceRecogRetrieveResult.getOnePredictIds()[0];

+ 13 - 0
src/main/java/com/iden/bms/service/FaceImageService.java

@@ -121,4 +121,17 @@ public class FaceImageService {
         return null;
     }
 
+    /**
+     * 根据图像文件名称得到IdenFaceImage
+     * @param imageFileName
+     * @return
+     */
+    public IdenFaceImage getIdenFaceImageByImageFileName(String imageFileName){
+
+        QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(IdenFaceImage::getImage,imageFileName);
+        IdenFaceImage idenFaceImage = idenFaceImageService.getOne(queryWrapper);
+        return idenFaceImage;
+    }
+
 }

+ 4 - 4
src/main/java/com/iden/bms/service/PersonService.java

@@ -180,7 +180,7 @@ public class PersonService {
                     throw new BDException("图像文件必须是图片格式!");
                 }
                 String saveFileName = DateUtils.getCurrYyyyMMddHHmmssDate() + "_" + UUID.randomUUID().toString()  + fileName.substring(fileName.lastIndexOf("."), fileName.length());
-                String picFullFileName = idenRoot + "data/final/image/person/" + saveFileName;
+                String picFullFileName = idenRoot + "data/final/person/" + saveFileName;
                 FileOutputStream fos = new FileOutputStream(picFullFileName);
                 fos.write(file.getBytes());
                 image = fileUrl + "person/" + saveFileName;
@@ -214,7 +214,7 @@ public class PersonService {
         String image = idenPerson.getImage();
         if(StringUtils.isNotEmpty(image)){
             String fileName = image.substring(image.lastIndexOf("/"));
-            File imgFile = new File(idenRoot + "data/final/image/person/" + fileName);
+            File imgFile = new File(idenRoot + "data/final/person/" + fileName);
             String featPtr = FaceIdenTool.getFeatPtr(idenRoot,imgFile);
             idenPerson.setFeatPtr(featPtr);
         }
@@ -237,13 +237,13 @@ public class PersonService {
         if (StringUtils.isNotEmpty(newImage) && !newImage.equals(oldImage)){
             //识别
             String fileNameNew = newImage.substring(newImage.lastIndexOf("/"));
-            File imgFileNew = new File(idenRoot + "data/final/image/person/" + fileNameNew);
+            File imgFileNew = new File(idenRoot + "data/final/person/" + fileNameNew);
             String featPtr = FaceIdenTool.getFeatPtr(idenRoot,imgFileNew);
             idenPerson.setFeatPtr(featPtr);
             // 删除老的文件
             if(StringUtils.isNotEmpty(oldImage)){
                 String fileNameOld = oldImage.substring(oldImage.lastIndexOf("/"));
-                File imgFileOld = new File(idenRoot + "data/final/image/person/" + fileNameOld);
+                File imgFileOld = new File(idenRoot + "data/final/person/" + fileNameOld);
                 if(imgFileOld.exists()){
                     imgFileOld.delete();
                 }

+ 63 - 33
src/main/java/com/iden/bms/service/TraceService.java

@@ -1,37 +1,27 @@
 package com.iden.bms.service;
 
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.iden.common.entity.IdenCrowd;
-import com.iden.common.entity.IdenPerson;
-import com.iden.common.entity.IdenPersonCrowdRef;
-import com.iden.common.enums.PersonTypeEnum;
-import com.iden.common.enums.PopulationTypeEnum;
+
+import com.face.monitor.FaceMonitor;
+import com.face.monitor.model.FaceModel;
+import com.iden.bms.face.FaceIdenTool;
+import com.iden.common.entity.IdenFaceImage;
 import com.iden.common.exception.BDException;
-import com.iden.common.service.IdenCrowdService;
-import com.iden.common.service.IdenPersonCrowdRefService;
-import com.iden.common.service.IdenPersonService;
+
 import com.iden.common.util.DateUtils;
 import com.iden.common.util.ImgUtil;
-import com.iden.common.util.MyBeanUtils;
-import com.iden.common.vo.PageReqVO;
-import com.iden.common.vo.PersonVO;
 import com.iden.common.vo.TraceVO;
 import com.iden.common.vo.UserLogindConvertVO;
-import org.springframework.beans.BeanUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import java.io.File;
 import java.io.FileOutputStream;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
@@ -44,12 +34,7 @@ import java.util.UUID;
 public class TraceService {
 
     @Resource
-    private IdenPersonService idenPersonService;
-
-    @Resource
-    private IdenPersonCrowdRefService idenPersonCrowdRefService;
-    @Resource
-    private IdenCrowdService idenCrowdService;
+    private FaceImageService faceImageService;
 
     @Value("${iden.root:#{null}}")
     private String idenRoot;
@@ -62,7 +47,7 @@ public class TraceService {
      * @return  访问URL
      */
     public String uploadImage(MultipartFile file) throws BDException {
-        String logo = null;
+        String image = null;
         try {
             if (file != null) {
                 //获取文件名
@@ -75,10 +60,10 @@ public class TraceService {
                     throw new BDException("图像文件必须是图片格式!");
                 }
                 String saveFileName = DateUtils.getCurrYyyyMMddHHmmssDate() + "_" + UUID.randomUUID().toString()  + fileName.substring(fileName.lastIndexOf("."), fileName.length());
-                String picFullFileName = idenRoot + "data/final/image/person/" + saveFileName;
+                String picFullFileName = idenRoot + "data/trace/" + saveFileName;
                 FileOutputStream fos = new FileOutputStream(picFullFileName);
                 fos.write(file.getBytes());
-                logo = fileUrl + "person/" + saveFileName;
+                image = saveFileName;
             } else {
                 throw new BDException("上传失败");
             }
@@ -86,18 +71,63 @@ public class TraceService {
             throw new BDException("上传失败",e);
         }
 
-        return logo;
+        return image;
     }
 
     /**
-     * 查询轨迹列表
-     * 图像识别,使用特征码查询图像库,得到图库表中对应的数据列表,同时缓存到表里
+     *  上传图像查询轨迹列表
+     * 图像识别,使用特征码查询图像库,得到图库表中对应的数据列表
      * @return
              */
-    public List<TraceVO> listTrace(String imageCodes, String beginTime, String endTime, UserLogindConvertVO loginUser) {
+    public List<TraceVO> listUploadImagesTrace(String images, String beginTime, String endTime, UserLogindConvertVO loginUser) {
+        if(images.endsWith(",")) {
+            images = images.substring(0, images.length() - 1);
+        }
+
+        String[] imageArr = images.split(",");
+        File[] imgFiles = new File[imageArr.length];
+        for (int i = 0; i < imageArr.length; i++) {
+            if (StringUtils.isNotEmpty(imageArr[i])){
+                imgFiles[i] = new File(idenRoot + "data/trace/" + imageArr[i]);
+            }
+        }
 
+        //上传的图像的特征码结构体数组
+        FaceModel[] faceModels = FaceIdenTool.extractFeature(idenRoot,imgFiles);
 
-        return null;
+        //初始化引擎,加载摄像头上传的图像人脸特征库
+        File cameraImageDirFile = new File(idenRoot + "data/final/camera/image");
+        File[] cameraImageFiles = getCameraImageFiles(cameraImageDirFile);
+        FaceMonitor faceMonitorCamera = FaceIdenTool.initFaceMonitor(idenRoot,cameraImageFiles);
+
+        List<TraceVO> result = new ArrayList<>();
+        for(FaceModel faceModel : faceModels) {
+           int hitIndex = FaceIdenTool.getHitIndex(faceMonitorCamera,faceModel);
+           if (hitIndex != -1) {
+               IdenFaceImage idenFaceImage = faceImageService.getIdenFaceImageByImageFileName(cameraImageFiles[hitIndex].getName());
+               if(idenFaceImage != null){
+                   TraceVO vo = new TraceVO();
+                   BeanUtil.copyProperties(idenFaceImage,vo);
+                   result.add(vo);
+               }
+           }
+        }
+        return result;
     }
 
+    private File[] getCameraImageFiles(File cameraImageDirFile) {
+        File[] resuit = new File[]{};
+
+        File[] cameraCodeDirFiles = cameraImageDirFile.listFiles();
+        if (cameraCodeDirFiles != null && cameraCodeDirFiles.length > 0){
+            for (File cameraCodeDirFile : cameraCodeDirFiles) {
+                File[] cameraImageFiles = cameraCodeDirFile.listFiles();
+                if (cameraImageFiles != null && cameraImageFiles.length > 0){
+                    resuit =  ArrayUtils.addAll(resuit,cameraImageFiles);
+                }
+
+            }
+        }
+        return resuit;
+    }
 }

+ 2 - 2
src/main/java/com/iden/common/cache/RedisKeyConstant.java

@@ -16,6 +16,6 @@ public class RedisKeyConstant {
     public static final String BACK_LOGIN_INFO = "BACK:LOGIN";
     public static final int BACK_LOGIN_INFO_TIME = 3600 * 24;
 
-
-
+    public static final String HANDLE_CAMERA_IMAGE = "HANDLE_CAMERA_IMAGE";
+    public static final String HANDLE_CAMERA_VIDEO = "HANDLE_CAMERA_VIDEO";
 }

+ 3 - 3
src/main/java/com/iden/common/entity/IdenTrace.java

@@ -37,9 +37,9 @@ public class IdenTrace implements Serializable {
     private Long id;
 
 
-    @ApiModelProperty("图像编码")
-    @TableField("IMAGE_CODE")
-    private String imageCode;
+    @ApiModelProperty("图像")
+    @TableField("IMAGE")
+    private String image;
 
 
     @ApiModelProperty("摄像头ID")

+ 2 - 3
src/main/java/com/iden/common/vo/TraceVO.java

@@ -22,13 +22,12 @@ public class TraceVO implements Serializable {
 
     private Long id;
 
-    @ApiModelProperty("图像编码")
-    private String imageCode;
+    @ApiModelProperty("图像")
+    private String image;
 
     @ApiModelProperty("摄像头ID")
     private Long cameraId;
 
-
     @ApiModelProperty("小区ID")
     private Long communityId;