TraceService.java 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package com.iden.bms.service;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.face.monitor.FaceMonitor;
  6. import com.face.monitor.model.FaceModel;
  7. import com.iden.bms.face.FaceIdenTool;
  8. import com.iden.common.entity.IdenFaceImage;
  9. import com.iden.common.entity.IdenWarningPersonTrace;
  10. import com.iden.common.exception.BDException;
  11. import com.iden.common.service.IdenWarningPersonTraceService;
  12. import com.iden.common.util.DateUtils;
  13. import com.iden.common.util.ImgUtil;
  14. import com.iden.common.vo.FaceRetrieveResultVO;
  15. import com.iden.common.vo.TraceVO;
  16. import com.iden.common.vo.UserLoginedConvertVO;
  17. import org.apache.commons.lang3.StringUtils;
  18. import org.springframework.beans.factory.annotation.Value;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.web.multipart.MultipartFile;
  21. import javax.annotation.Resource;
  22. import java.io.File;
  23. import java.io.FileOutputStream;
  24. import java.util.ArrayList;
  25. import java.util.Date;
  26. import java.util.List;
  27. import java.util.UUID;
  28. /**
  29. *
  30. * @author makejava
  31. * @since 2021-05-21 00:08:38
  32. */
  33. @Service
  34. public class TraceService {
  35. @Resource
  36. private FaceImageService faceImageService;
  37. @Resource
  38. private IdenWarningPersonTraceService idenWarningPersonTraceService;
  39. @Value("${iden.root:#{null}}")
  40. private String idenRoot;
  41. @Value("${file.url:#{null}}")
  42. private String fileUrl;
  43. /**
  44. * 上传图像
  45. * @param file
  46. * @return 访问URL
  47. */
  48. public String uploadImage(MultipartFile file) throws BDException {
  49. String image = null;
  50. try {
  51. if (file != null) {
  52. //获取文件名
  53. String fileName = file.getOriginalFilename();
  54. if (org.springframework.util.StringUtils.isEmpty(fileName) || file.getSize() == 0) {
  55. throw new BDException("图像文件不能为空!");
  56. }
  57. //验证文件名是否合格
  58. if (!ImgUtil.isImg(fileName)) {
  59. throw new BDException("图像文件必须是图片格式!");
  60. }
  61. String saveFileName = DateUtils.getCurrYyyyMMddHHmmssDate() + "_" + UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."), fileName.length());
  62. String picFullFileName = idenRoot + "data/trace/" + saveFileName;
  63. FileOutputStream fos = new FileOutputStream(picFullFileName);
  64. fos.write(file.getBytes());
  65. image = saveFileName;
  66. } else {
  67. throw new BDException("上传失败");
  68. }
  69. } catch (Exception e) {
  70. throw new BDException("上传失败",e);
  71. }
  72. return image;
  73. }
  74. /**
  75. * 上传图像查询轨迹列表
  76. * 图像识别,使用特征码查询图像库,得到图库表中对应的数据列表
  77. * @return
  78. */
  79. public List<TraceVO> listUploadImagesTrace(String imageNames, String beginDate, String endDate, UserLoginedConvertVO loginUser) {
  80. Date dateBegin = null;
  81. if(StringUtils.isNotEmpty(beginDate)){
  82. dateBegin = DateUtils.strToDate(beginDate,"yyyyMMdd");
  83. }
  84. Date dateEnd = null;
  85. if(StringUtils.isNotEmpty(endDate)){
  86. dateEnd = DateUtils.strToDate(endDate,"yyyyMMdd");
  87. }
  88. if(imageNames.endsWith(",")) {
  89. imageNames = imageNames.substring(0, imageNames.length() - 1);
  90. }
  91. String[] imageNameArr = imageNames.split(",");
  92. File[] imgFiles = new File[imageNameArr.length];
  93. for (int i = 0; i < imageNameArr.length; i++) {
  94. if (StringUtils.isNotEmpty(imageNameArr[i])){
  95. imgFiles[i] = new File(idenRoot + "data/trace/" + imageNameArr[i]);
  96. }
  97. }
  98. //上传的图像的特征码结构体数组
  99. FaceModel[] faceModels = FaceIdenTool.extractFeature(idenRoot,imgFiles);
  100. //初始化引擎,加载摄像头上传的在时间段内的图像人脸特征库
  101. File cameraImageDirFile = new File(idenRoot + "data/final/camera/image");
  102. File[] cameraImageFiles = getCameraImageFiles(cameraImageDirFile,dateBegin,dateEnd);
  103. FaceMonitor faceMonitorCamera = FaceIdenTool.initFaceMonitor(idenRoot,cameraImageFiles);
  104. List<TraceVO> result = new ArrayList<>();
  105. for(FaceModel faceModel : faceModels) {
  106. FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitorCamera,faceModel);
  107. if (faceRetrieveResultVO != null) {
  108. int hitIndex = faceRetrieveResultVO.getIndex();
  109. IdenFaceImage idenFaceImage = faceImageService.getIdenFaceImageByImageFileName(cameraImageFiles[hitIndex].getName());
  110. if(idenFaceImage != null){
  111. TraceVO vo = new TraceVO();
  112. BeanUtil.copyProperties(idenFaceImage,vo);
  113. result.add(vo);
  114. }
  115. }
  116. }
  117. return result;
  118. }
  119. private File[] getCameraImageFiles(File cameraImageDirFile,Date dateBegin, Date dateEnd) {
  120. List<File> list = new ArrayList<>();
  121. File[] cameraCodeDirFiles = cameraImageDirFile.listFiles();
  122. if (cameraCodeDirFiles != null && cameraCodeDirFiles.length > 0){
  123. for (File cameraCodeDirFile : cameraCodeDirFiles) {
  124. File[] cameraImageFiles = cameraCodeDirFile.listFiles();
  125. if (cameraImageFiles != null && cameraImageFiles.length > 0){
  126. for (File cameraImageFile : cameraImageFiles){
  127. String photographTime = cameraImageFile.getName().substring(0, cameraImageFile.getName().indexOf("_"));
  128. Date photographDate = DateUtils.strToDate(photographTime.substring(0,8),"yyyyMMdd");
  129. if(dateBegin != null && photographDate.before(dateBegin)){
  130. continue;
  131. }
  132. if(dateEnd != null && photographDate.after(dateEnd)){
  133. continue;
  134. }
  135. list.add(cameraImageFile);
  136. }
  137. }
  138. }
  139. }
  140. File[] resuit = new File[list.size()];
  141. return list.toArray(resuit);
  142. }
  143. /**
  144. * 上传图像查询轨迹列表
  145. * 图像识别,使用特征码查询图像库,得到图库表中对应的数据列表
  146. * @return
  147. */
  148. public List<TraceVO> listTrace(String uid, String beginDate, String endDate, UserLoginedConvertVO loginUser) {
  149. List<TraceVO> vos = new ArrayList<>();
  150. QueryWrapper<IdenWarningPersonTrace> queryWrapper = new QueryWrapper<>();
  151. queryWrapper.lambda().eq(IdenWarningPersonTrace::getUid,uid)
  152. .ge(StringUtils.isNotEmpty(beginDate),IdenWarningPersonTrace::getDataDate,beginDate)
  153. .le(StringUtils.isNotEmpty(endDate),IdenWarningPersonTrace::getDataDate,endDate)
  154. .orderByAsc(IdenWarningPersonTrace::getPhotographTime);
  155. List<IdenWarningPersonTrace> idenWarningPersonTraceList = this.idenWarningPersonTraceService.list(queryWrapper);
  156. if(CollUtil.isNotEmpty(idenWarningPersonTraceList)) {
  157. idenWarningPersonTraceList.forEach(item->{
  158. TraceVO vo = new TraceVO();
  159. IdenWarningPersonTrace idenWarningPersonTrace = new IdenWarningPersonTrace();
  160. BeanUtil.copyProperties(idenWarningPersonTrace,vo);
  161. vos.add(vo);
  162. });
  163. }
  164. return vos;
  165. }
  166. }