package com.iden.bms.service; import cn.hutool.core.bean.BeanUtil; 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.bms.face.FaceIdenTool; import com.iden.common.entity.IdenFaceImage; import com.iden.common.entity.IdenWarningPersonTrace; import com.iden.common.exception.BDException; import com.iden.common.service.IdenWarningPersonTraceService; import com.iden.common.util.DateUtils; import com.iden.common.util.ImgUtil; import com.iden.common.vo.FaceRetrieveResultVO; import com.iden.common.vo.TraceVO; import com.iden.common.vo.UserLoginedConvertVO; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; 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; /** * * @author makejava * @since 2021-05-21 00:08:38 */ @Service public class TraceService { @Resource private FaceImageService faceImageService; @Resource private IdenWarningPersonTraceService idenWarningPersonTraceService; @Value("${iden.root:#{null}}") private String idenRoot; @Value("${file.url:#{null}}") private String fileUrl; /** * 上传图像 * @param file * @return 访问URL */ public String uploadImage(MultipartFile file) throws BDException { String image = null; try { if (file != null) { //获取文件名 String fileName = file.getOriginalFilename(); if (org.springframework.util.StringUtils.isEmpty(fileName) || file.getSize() == 0) { throw new BDException("图像文件不能为空!"); } //验证文件名是否合格 if (!ImgUtil.isImg(fileName)) { throw new BDException("图像文件必须是图片格式!"); } String saveFileName = DateUtils.getCurrYyyyMMddHHmmssDate() + "_" + UUID.randomUUID().toString() + fileName.substring(fileName.lastIndexOf("."), fileName.length()); String picFullFileName = idenRoot + "data/trace/" + saveFileName; FileOutputStream fos = new FileOutputStream(picFullFileName); fos.write(file.getBytes()); image = saveFileName; } else { throw new BDException("上传失败"); } } catch (Exception e) { throw new BDException("上传失败",e); } return image; } /** * 上传图像查询轨迹列表 * 图像识别,使用特征码查询图像库,得到图库表中对应的数据列表 * @return */ public List listUploadImagesTrace(String imageNames, String beginDate, String endDate, UserLoginedConvertVO loginUser) { Date dateBegin = null; if(StringUtils.isNotEmpty(beginDate)){ dateBegin = DateUtils.strToDate(beginDate,"yyyyMMdd"); } Date dateEnd = null; if(StringUtils.isNotEmpty(endDate)){ dateEnd = DateUtils.strToDate(endDate,"yyyyMMdd"); } if(imageNames.endsWith(",")) { imageNames = imageNames.substring(0, imageNames.length() - 1); } String[] imageNameArr = imageNames.split(","); File[] imgFiles = new File[imageNameArr.length]; for (int i = 0; i < imageNameArr.length; i++) { if (StringUtils.isNotEmpty(imageNameArr[i])){ imgFiles[i] = new File(idenRoot + "data/trace/" + imageNameArr[i]); } } //上传的图像的特征码结构体数组 FaceModel[] faceModels = FaceIdenTool.extractFeature(idenRoot,imgFiles); //初始化引擎,加载摄像头上传的在时间段内的图像人脸特征库 File cameraImageDirFile = new File(idenRoot + "data/final/camera/image"); File[] cameraImageFiles = getCameraImageFiles(cameraImageDirFile,dateBegin,dateEnd); FaceMonitor faceMonitorCamera = FaceIdenTool.initFaceMonitor(idenRoot,cameraImageFiles); List result = new ArrayList<>(); for(FaceModel faceModel : faceModels) { FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitorCamera,faceModel); if (faceRetrieveResultVO != null) { int hitIndex = faceRetrieveResultVO.getIndex(); 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,Date dateBegin, Date dateEnd) { List list = new ArrayList<>(); File[] cameraCodeDirFiles = cameraImageDirFile.listFiles(); if (cameraCodeDirFiles != null && cameraCodeDirFiles.length > 0){ for (File cameraCodeDirFile : cameraCodeDirFiles) { File[] cameraImageFiles = cameraCodeDirFile.listFiles(); if (cameraImageFiles != null && cameraImageFiles.length > 0){ for (File cameraImageFile : cameraImageFiles){ String photographTime = cameraImageFile.getName().substring(0, cameraImageFile.getName().indexOf("_")); Date photographDate = DateUtils.strToDate(photographTime.substring(0,8),"yyyyMMdd"); if(dateBegin != null && photographDate.before(dateBegin)){ continue; } if(dateEnd != null && photographDate.after(dateEnd)){ continue; } list.add(cameraImageFile); } } } } File[] resuit = new File[list.size()]; return list.toArray(resuit); } /** * 上传图像查询轨迹列表 * 图像识别,使用特征码查询图像库,得到图库表中对应的数据列表 * @return */ public List listTrace(String uid, String beginDate, String endDate, UserLoginedConvertVO loginUser) { List vos = new ArrayList<>(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(IdenWarningPersonTrace::getUid,uid) .ge(StringUtils.isNotEmpty(beginDate),IdenWarningPersonTrace::getDataDate,beginDate) .le(StringUtils.isNotEmpty(endDate),IdenWarningPersonTrace::getDataDate,endDate) .orderByAsc(IdenWarningPersonTrace::getPhotographTime); List idenWarningPersonTraceList = this.idenWarningPersonTraceService.list(queryWrapper); if(CollUtil.isNotEmpty(idenWarningPersonTraceList)) { idenWarningPersonTraceList.forEach(item->{ TraceVO vo = new TraceVO(); IdenWarningPersonTrace idenWarningPersonTrace = new IdenWarningPersonTrace(); BeanUtil.copyProperties(idenWarningPersonTrace,vo); vos.add(vo); }); } return vos; } }