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.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; 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.Date; import java.util.List; /** * @Author: stw * @Date: 2021/7/14 * @Desc: */ @Service public class FaceIdenService { @Resource private IdenImageStoreService idenImageStoreService; @Resource private IdenCameraService idenCameraService; @Resource private IdenCommunityService idenCommunityService; @Value("${iden.root:#{null}}") private String idenRoot; @Value("${image.url:#{null}}") private String imageUrl; private static final Logger logger = LogManager.getLogger(FaceIdenService.class); /** * * @throws Exception */ public void exe() throws Exception { logger.info("FaceIdenService.exe start..."); File originImageDirFile = new File(idenRoot + "data/origin/image"); //初始化引擎 FaceMonitor faceMonitor = new FaceMonitor(); faceMonitor.init(idenRoot + "face/model", 0); //使用摄像头编码做目录名,里面图像或视频的名称上加上拍照时间, // 比如 20211217123023.jpg 20211217123023~20211217123323.mp4 if (originImageDirFile.isDirectory()) { File[] cameraCodeDirs = originImageDirFile.listFiles(); if(cameraCodeDirs != null && cameraCodeDirs.length > 0){ logger.info("FaceIdenService.exe ...1"); for(File cameraCodedir : cameraCodeDirs) { if(cameraCodedir.isDirectory()){ File[] imgFiles = cameraCodedir.listFiles(); if(imgFiles != null && imgFiles.length > 0){ logger.info("FaceIdenService.exe ...2"); String cameraCode = cameraCodedir.getName(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(IdenCamera::getCode,cameraCode); IdenCamera idenCamera = idenCameraService.getOne(queryWrapper); if(idenCamera == null){ continue; } logger.info("FaceIdenService.exe ...3"); //获取特征码 FaceModel[] faceModels = FaceIdenTool.extractFeature(faceMonitor,imgFiles); List idenImageStoreList = new ArrayList<>(); for(int i = 0; i < imgFiles.length; i++) { File imgFile = imgFiles[i]; IdenImageStore idenImageStore = new IdenImageStore(); idenImageStore.setCameraId(idenCamera.getId()); idenImageStore.setCommunityId(idenCamera.getCommunityId()); String photographPlace = idenCamera.getPlace(); logger.info("FaceIdenService.exe ...4"); if (StringUtils.isEmpty(photographPlace)) { IdenCommunity idenCommunity = idenCommunityService.getById(idenCamera.getCommunityId()); if(idenCommunity != null) { photographPlace = idenCommunity.getName() + "(" + idenCamera.getLongitude() + ":" + idenCamera.getLatitude() + ")"; } } logger.info("FaceIdenService.exe ...5"); idenImageStore.setPhotographPlace(photographPlace); String imgFileName = imgFile.getName(); String photographTime = imgFileName.substring(0, imgFileName.indexOf("_")); idenImageStore.setPhotographTime(DateUtils.strToDate(photographTime,"yyyyMMddHHmmss")); idenImageStore.setFeatPtr(FaceIdenTool.getFeatPtr(faceModels,String.valueOf(i))); File finalDir = new File(imgFile.getParentFile().getAbsolutePath().replace("origin","final")); if(!finalDir.exists()){ finalDir.mkdirs(); } logger.info("FaceIdenService.exe ...finalDir == " + finalDir.getAbsolutePath()); logger.info("FaceIdenService.exe ...imgFile.getName() == " + imgFileName); File finalImgFile = new File(finalDir, imgFileName); logger.info("FaceIdenService.exe ...finalImgFile == " + finalImgFile.getAbsolutePath()); imgFile.renameTo(finalImgFile);//移动到最终目录 idenImageStore.setImage( imageUrl + cameraCode + "/" + finalImgFile.getName()); //TODO 关联personId idenImageStore.setCreateTime(new Date()); idenImageStoreList.add(idenImageStore); } logger.info("FaceIdenService.exe ...7"); //把图像存到图库中 if (CollUtil.isNotEmpty(idenImageStoreList)) { logger.info("FaceIdenService.exe ...8"); idenImageStoreService.saveBatch(idenImageStoreList); } } } } } } logger.info("FaceIdenService.exe end"); } }