Jelajahi Sumber

图像识别

suntianwu 3 tahun lalu
induk
melakukan
3297658be0

+ 12 - 3
src/main/java/com/iden/bms/face/FaceIdenSchedule.java

@@ -1,11 +1,15 @@
 package com.iden.bms.face;
 
+
+import com.iden.common.service.IdenImageStoreService;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 
+import javax.annotation.Resource;
+
 /**
  * 定时读取目录下图片,调用人脸识别引擎,把特征码入库
  */
@@ -13,14 +17,19 @@ import org.springframework.scheduling.annotation.Scheduled;
 @EnableScheduling
 @EnableAsync
 public class FaceIdenSchedule {
+
+    @Resource
+    private FaceIdenService faceIdenService;
+
     @Async
     @Scheduled(cron = "0 0/10 0 * * ?")
-    public void updateComputeTrafficToFinish() {
+    public void exe() {
         try {
-            //大于两天的话单日志默认已计算
-            koalaOutCallDao.updateComputeTrafficToFinish();
+            faceIdenService.exe();
         } catch (Exception e) {
             e.getMessage();
         }
     }
+
+
 }

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

@@ -0,0 +1,134 @@
+package com.iden.bms.face;
+
+
+
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.face.monitor.FaceMonitor;
+import com.face.monitor.model.FaceModel;
+import com.iden.common.entity.IdenCamera;
+import com.iden.common.entity.IdenCommunity;
+import com.iden.common.entity.IdenImageStore;
+
+import com.iden.common.service.IdenCameraService;
+import com.iden.common.service.IdenCommunityService;
+import com.iden.common.service.IdenImageStoreService;
+
+import com.iden.common.util.DateUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+
+/**
+ * @Author: stw
+ * @Date: 2021/7/14
+ * @Desc:
+ */
+@Service
+public class FaceIdenService {
+    @Resource
+    private IdenImageStoreService idenImageStoreService;
+    @Resource
+    private IdenCameraService idenCameraService;
+    @Resource
+    private IdenCommunityService idenCommunityService;
+
+    @Value("${data.image.root:#{null}}")
+    private String imageRoot;
+
+
+    /**
+     *
+     * @throws Exception
+     */
+
+    public void exe() throws Exception {
+
+        File srcImageDirFile = new File(imageRoot + "src/image");
+        //初始化引擎
+        FaceMonitor faceMonitor = new FaceMonitor();
+        faceMonitor.init("./model", 0);
+
+        //使用摄像头编码做目录名,里面图像或视频的名称上加上拍照时间,
+        // 比如  2021-12-17_12:30:23.jpg     2021-12-17_12:30:23~2021-12-17_12:33:23.avi
+        if (srcImageDirFile.isDirectory()) {
+            File[]  cameraCodeDirs = srcImageDirFile.listFiles();
+            if(cameraCodeDirs != null && cameraCodeDirs.length > 0){
+                for(File cameraCodedir : cameraCodeDirs) {
+                    if(cameraCodedir.isDirectory()){
+                        File[] imgFiles = cameraCodedir.listFiles();
+                        if(imgFiles != null && imgFiles.length > 0){
+                            String cameraCode = cameraCodedir.getName();
+                            QueryWrapper<IdenCamera> queryWrapper = new QueryWrapper<>();
+                            queryWrapper.lambda().eq(IdenCamera::getCode,cameraCode);
+                            IdenCamera idenCamera = idenCameraService.getOne(queryWrapper);
+                            if(idenCamera == null){
+                                continue;
+                            }
+
+                           //获取特征码
+                            FaceModel[] faceModels = FaceIdenTool.extractFeature(faceMonitor,imgFiles);
+
+                            List<IdenImageStore> idenImageStoreList = new ArrayList<>();
+                            for(File imgFile : imgFiles) {
+                                IdenImageStore idenImageStore = new IdenImageStore();
+                                idenImageStore.setCameraId(idenCamera.getId());
+                                idenImageStore.setCommunityId(idenCamera.getCommunityId());
+                                String photographPlace = idenCamera.getPlace();
+                                if (StringUtils.isEmpty(photographPlace)) {
+                                    IdenCommunity idenCommunity = idenCommunityService.getById(idenCamera.getCommunityId());
+                                    if(idenCommunity != null) {
+                                        photographPlace = idenCommunity.getName() + "(" + idenCamera.getLongitude() + ":" + idenCamera.getLatitude() + ")";
+                                    }
+                                }
+
+                                idenImageStore.setPhotographPlace(photographPlace);
+
+                                String photographTime = imgFile.getName().replace(".jpg","");
+                                idenImageStore.setPhotographTime(DateUtils.strToDate(photographTime,"yyyy-MM-dd_HH:mm:ss"));
+
+                                idenImageStore.setFeatPtr(FaceIdenTool.getFeatPtr(faceModels,imgFile.getName()));
+
+                                File finalDir = new File(imgFile.getParentFile().getAbsolutePath().replace("src","final"));
+                                if(!finalDir.exists()){
+                                    finalDir.mkdirs();
+                                }
+
+                                File finalImgFile = new File(finalDir + imgFile.getName());
+                                imgFile.renameTo(finalImgFile);//移动到最终目录
+
+                                idenImageStore.setImage(finalImgFile.getAbsolutePath());
+
+                                //TODO 关联personId
+
+                                idenImageStoreList.add(idenImageStore);
+                            }
+
+                            //把图像存到图库中
+                            if (CollUtil.isNotEmpty(idenImageStoreList)) {
+                                idenImageStoreService.saveBatch(idenImageStoreList);
+                            }
+                        }
+
+                    }
+                }
+            }
+        }
+    }
+
+
+     public static void main(String[] args) {
+         String faceTestDir = "./data/";
+         String faceFilePath = String.format(Locale.CHINA, "%s%d.jpg", faceTestDir, 1);
+         System.out.println(faceFilePath);
+     }
+
+}

+ 77 - 0
src/main/java/com/iden/bms/face/FaceIdenTool.java

@@ -0,0 +1,77 @@
+package com.iden.bms.face;
+
+import com.face.monitor.FaceMonitor;
+import com.face.monitor.model.FaceModel;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class FaceIdenTool {
+
+    public static FaceModel[] extractFeature(FaceMonitor faceMonitor, File[] imgFiles){
+        List<byte[]> faceTestImageList = new ArrayList<>();
+        for(File imgFile : imgFiles) {
+            faceTestImageList.add(readFileBytes(imgFile.getAbsolutePath()));
+        }
+        FaceModel[] faceModels = faceMonitor.extractFeature(faceTestImageList);
+        return faceModels;
+    }
+
+    public static String getFeatPtr(FaceModel[] faceModels,String name) {
+        if(faceModels != null && faceModels.length > 0) {
+            for(FaceModel faceModel : faceModels){
+                if (name.equals(faceModel.getName())) {
+                    return new String(faceModel.getFeatValue());
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * read file
+     *
+     * @param filePath
+     * @return if file not exist, return null, else return content of file
+     * @throws RuntimeException if an error occurs while operator BufferedReader
+     */
+    private static byte[] readFileBytes(String filePath) {
+        File file = new File(filePath);
+        if (file == null || !file.isFile()) {
+            return null;
+        }
+
+        InputStream inputStream = null;
+        ByteArrayOutputStream baos = null;
+        try {
+            inputStream = new FileInputStream(file);
+            baos = new ByteArrayOutputStream();
+
+            byte[] buffer = new byte[1024];
+            int byteCount = 0;
+            while ((byteCount = inputStream.read(buffer)) != -1) {// 循环从输入流读取
+                // buffer字节
+                baos.write(buffer, 0, byteCount);// 将读取的输入流写入到输出流
+            }
+            baos.flush();// 刷新缓冲区
+            return baos.toByteArray();
+        } catch (IOException e) {
+            return null;
+            //throw new RuntimeException("IOException occurred. ", e);
+        } finally {
+            close(inputStream);
+            close(baos);
+        }
+    }
+
+    private static void close(Closeable closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (IOException e) {
+                throw new RuntimeException("IOException occurred. ", e);
+            }
+        }
+    }
+}

+ 1 - 1
src/main/java/com/iden/bms/service/SysUserService.java

@@ -132,7 +132,7 @@ public class SysUserService {
         IdenSysUser idenSysUser = new IdenSysUser();
         BeanUtil.copyProperties(vo,idenSysUser);
         idenSysUser.setCreateTime(new Date());
-        idenSysUser.setRole(UserRoleEnum.SYSTEM.getValue());
+        idenSysUser.setRole(UserRoleEnum.HIGH.getValue());
 
         this.idenSysUserService.save(idenSysUser);
         return 0;

+ 4 - 0
src/main/resources/application-dev.properties

@@ -28,3 +28,7 @@ spring.redis.jedis.pool.max-idle=10
 spring.redis.jedis.pool.max-wait=-1
 spring.redis.jedis.pool.min-idle=5
 #################################### redis的集群标准配置 结束 ##############################
+
+#图像数据根目录
+data.image.root=/data/iden/data/
+

+ 2 - 0
src/main/resources/application-prod.properties

@@ -32,3 +32,5 @@ spring.redis.jedis.pool.max-wait=-1
 spring.redis.jedis.pool.min-idle=5
 #################################### redis的集群标准配置 结束 ##############################
 
+#图像数据根目录
+data.image.root=/data/iden/data/