|
@@ -90,123 +90,127 @@ public class FaceIdenService {
|
|
|
logger.info("FaceIdenService.handleCameraImage 2...");
|
|
|
FaceMonitor faceMonitorPerson = FaceIdenTool.initFaceMonitor(idenRoot,imgPersonFiles);
|
|
|
|
|
|
- for(File cameraCodedir : cameraCodeDirs) {
|
|
|
- if(cameraCodedir.isDirectory()){
|
|
|
- File[] imgFiles = FileUtil.sortByName(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;
|
|
|
- }
|
|
|
- logger.info("FaceIdenService.handleCameraImage 3...");
|
|
|
- //获取特征码
|
|
|
- FaceModel[] faceModels = FaceIdenTool.extractFeature(idenRoot,imgFiles);
|
|
|
-
|
|
|
- List<IdenFaceImage> idenFaceImageList = new ArrayList<>();
|
|
|
- for(int i = 0; i < imgFiles.length; i++) {
|
|
|
- File imgFile = imgFiles[i];
|
|
|
- String imgFileName = imgFile.getName();
|
|
|
- IdenFaceImage idenFaceImage = new IdenFaceImage();
|
|
|
- //识别特征码
|
|
|
- if (faceModels[i] != null) {
|
|
|
- String featPtr = ByteUtil.byte2Hex(faceModels[i].getFeatValue());
|
|
|
- //没有人脸的、不是正面的、不符合标准的,连拍的图片
|
|
|
- if(FaceIdenTool.isBad(featPtr) || isContinuation(cameraCode,imgFileName,featPtr)) {
|
|
|
- File discardDir = new File(imgFile.getParentFile().getAbsolutePath().replace("origin","discard"));
|
|
|
- if(!discardDir.exists()){
|
|
|
- discardDir.mkdirs();
|
|
|
+ try {
|
|
|
+ for (File cameraCodedir : cameraCodeDirs) {
|
|
|
+ if (cameraCodedir.isDirectory()) {
|
|
|
+ File[] imgFiles = FileUtil.sortByName(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;
|
|
|
+ }
|
|
|
+ logger.info("FaceIdenService.handleCameraImage 3...");
|
|
|
+ //获取特征码
|
|
|
+ FaceModel[] faceModels = FaceIdenTool.extractFeature(idenRoot, imgFiles);
|
|
|
+
|
|
|
+ List<IdenFaceImage> idenFaceImageList = new ArrayList<>();
|
|
|
+ for (int i = 0; i < imgFiles.length; i++) {
|
|
|
+ File imgFile = imgFiles[i];
|
|
|
+ String imgFileName = imgFile.getName();
|
|
|
+ IdenFaceImage idenFaceImage = new IdenFaceImage();
|
|
|
+ //识别特征码
|
|
|
+ if (faceModels[i] != null) {
|
|
|
+ String featPtr = ByteUtil.byte2Hex(faceModels[i].getFeatValue());
|
|
|
+ //没有人脸的、不是正面的、不符合标准的,连拍的图片
|
|
|
+ if (FaceIdenTool.isBad(featPtr) || isContinuation(cameraCode, imgFileName, featPtr)) {
|
|
|
+ File discardDir = new File(imgFile.getParentFile().getAbsolutePath().replace("origin", "discard"));
|
|
|
+ if (!discardDir.exists()) {
|
|
|
+ discardDir.mkdirs();
|
|
|
+ }
|
|
|
+ File finalImgFile = new File(discardDir, imgFileName);
|
|
|
+ imgFile.renameTo(finalImgFile);//移动到废弃目录
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ idenFaceImage.setFeatPtr(featPtr);
|
|
|
+ //存到redis
|
|
|
+ redisUtil.hset(RedisKeyConstant.HANDLE_CAMERA_IMAGE_FIRST + "_" + cameraCode, imgFileName, featPtr, RedisKeyConstant.HANDLE_CAMERA_IMAGE_FIRST_TIME);
|
|
|
}
|
|
|
- File finalImgFile = new File(discardDir, imgFileName);
|
|
|
- imgFile.renameTo(finalImgFile);//移动到废弃目录
|
|
|
- continue;
|
|
|
- } else {
|
|
|
- idenFaceImage.setFeatPtr(featPtr);
|
|
|
- //存到redis
|
|
|
- redisUtil.hset(RedisKeyConstant.HANDLE_CAMERA_IMAGE_FIRST + "_" + cameraCode, imgFileName, featPtr, RedisKeyConstant.HANDLE_CAMERA_IMAGE_FIRST_TIME);
|
|
|
- }
|
|
|
|
|
|
- }
|
|
|
- idenFaceImage.setCameraId(idenCamera.getId());
|
|
|
- idenFaceImage.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() + ")";
|
|
|
- } else {
|
|
|
- photographPlace = "(" + idenCamera.getLongitude() + ":" + idenCamera.getLatitude() + ")";
|
|
|
}
|
|
|
- }
|
|
|
- idenFaceImage.setPhotographPlace(photographPlace);
|
|
|
- idenFaceImage.setLongitude(idenCamera.getLongitude());
|
|
|
- idenFaceImage.setLatitude(idenCamera.getLatitude());
|
|
|
-
|
|
|
- String photographTime = imgFileName.substring(0, imgFileName.indexOf("_"));
|
|
|
- idenFaceImage.setPhotographTime(DateUtils.strToDate(photographTime,"yyyyMMddHHmmss"));
|
|
|
- idenFaceImage.setDataDate(photographTime.substring(0,8));
|
|
|
-
|
|
|
- File finalDir = new File(imgFile.getParentFile().getAbsolutePath().replace("origin","final"));
|
|
|
- if(!finalDir.exists()){
|
|
|
- finalDir.mkdirs();
|
|
|
- }
|
|
|
- logger.info("FaceIdenService.handleCameraImage ...finalDir == " + finalDir.getAbsolutePath());
|
|
|
- logger.info("FaceIdenService.handleCameraImage ...imgFile.getName() == " + imgFileName);
|
|
|
- File finalImgFile = new File(finalDir, imgFileName);
|
|
|
-
|
|
|
- logger.info("FaceIdenService.handleCameraImage ...finalImgFile == " + finalImgFile.getAbsolutePath());
|
|
|
-
|
|
|
- imgFile.renameTo(finalImgFile);//移动到最终目录
|
|
|
+ idenFaceImage.setCameraId(idenCamera.getId());
|
|
|
+ idenFaceImage.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() + ")";
|
|
|
+ } else {
|
|
|
+ photographPlace = "(" + idenCamera.getLongitude() + ":" + idenCamera.getLatitude() + ")";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ idenFaceImage.setPhotographPlace(photographPlace);
|
|
|
+ idenFaceImage.setLongitude(idenCamera.getLongitude());
|
|
|
+ idenFaceImage.setLatitude(idenCamera.getLatitude());
|
|
|
|
|
|
- idenFaceImage.setImage( fileUrl + "camera/image/" + cameraCode + "/" + finalImgFile.getName());
|
|
|
+ String photographTime = imgFileName.substring(0, imgFileName.indexOf("_"));
|
|
|
+ idenFaceImage.setPhotographTime(DateUtils.strToDate(photographTime, "yyyyMMddHHmmss"));
|
|
|
+ idenFaceImage.setDataDate(photographTime.substring(0, 8));
|
|
|
|
|
|
- //和人员图像库比对特征码,关联personId
|
|
|
- if(faceModels[i] != null){
|
|
|
+ File finalDir = new File(imgFile.getParentFile().getAbsolutePath().replace("origin", "final"));
|
|
|
+ if (!finalDir.exists()) {
|
|
|
+ finalDir.mkdirs();
|
|
|
+ }
|
|
|
+ logger.info("FaceIdenService.handleCameraImage ...finalDir == " + finalDir.getAbsolutePath());
|
|
|
+ logger.info("FaceIdenService.handleCameraImage ...imgFile.getName() == " + imgFileName);
|
|
|
+ File finalImgFile = new File(finalDir, imgFileName);
|
|
|
+
|
|
|
+ logger.info("FaceIdenService.handleCameraImage ...finalImgFile == " + finalImgFile.getAbsolutePath());
|
|
|
+
|
|
|
+ imgFile.renameTo(finalImgFile);//移动到最终目录
|
|
|
+
|
|
|
+ idenFaceImage.setImage(fileUrl + "camera/image/" + cameraCode + "/" + finalImgFile.getName());
|
|
|
+
|
|
|
+ //和人员图像库比对特征码,关联personId
|
|
|
+ if (faceModels[i] != null) {
|
|
|
+
|
|
|
+ FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitorPerson, faceModels[i]);
|
|
|
+ if (faceRetrieveResultVO != null) {
|
|
|
+ int hitIndex = faceRetrieveResultVO.getIndex();
|
|
|
+ IdenPerson idenPerson = personService.getPersonIdByImageFileName(imgPersonFiles[hitIndex].getName());
|
|
|
+ if (idenPerson != null) {
|
|
|
+ idenFaceImage.setPersonId(idenPerson.getId());
|
|
|
+ idenFaceImage.setUid(idenPerson.getUid());
|
|
|
+ idenFaceImage.setType(idenPerson.getType());
|
|
|
+ idenFaceImage.setGender(idenPerson.getGender());
|
|
|
+ float score = faceRetrieveResultVO.getScore();
|
|
|
+ BigDecimal b = new BigDecimal(score);
|
|
|
+ double similarity = b.divide(new BigDecimal(100)).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
|
+
|
|
|
+ idenFaceImage.setSimilarity(similarity);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitorPerson,faceModels[i]);
|
|
|
- if (faceRetrieveResultVO != null){
|
|
|
- int hitIndex = faceRetrieveResultVO.getIndex();
|
|
|
- IdenPerson idenPerson = personService.getPersonIdByImageFileName(imgPersonFiles[hitIndex].getName());
|
|
|
- if(idenPerson != null) {
|
|
|
- idenFaceImage.setPersonId(idenPerson.getId());
|
|
|
- idenFaceImage.setUid(idenPerson.getUid());
|
|
|
- idenFaceImage.setType(idenPerson.getType());
|
|
|
- idenFaceImage.setGender(idenPerson.getGender());
|
|
|
- float score = faceRetrieveResultVO.getScore();
|
|
|
- BigDecimal b = new BigDecimal(score);
|
|
|
- double similarity = b.divide(new BigDecimal(100)).setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue();
|
|
|
+ }
|
|
|
+ if (idenFaceImage.getPersonId() == null) { //没有关联上,是陌生人
|
|
|
+ idenFaceImage.setType(PersonTypeEnum.STRANGER.getValue());
|
|
|
|
|
|
- idenFaceImage.setSimilarity(similarity);
|
|
|
+ //查询以前的陌生人图库,进行人脸识别,若是同一个人,得到uid, 设置为一样
|
|
|
+ String uid = relevanceBeforeFace(idenFaceImage.getFeatPtr());
|
|
|
+ if (StringUtils.isEmpty(uid)) {
|
|
|
+ uid = UUID.randomUUID().toString();
|
|
|
}
|
|
|
+ idenFaceImage.setUid(uid);
|
|
|
}
|
|
|
-
|
|
|
+ idenFaceImage.setCreateTime(new Date());
|
|
|
+ idenFaceImageList.add(idenFaceImage);
|
|
|
}
|
|
|
- if (idenFaceImage.getPersonId() == null){ //没有关联上,是陌生人
|
|
|
- idenFaceImage.setType(PersonTypeEnum.STRANGER.getValue());
|
|
|
|
|
|
- //查询以前的陌生人图库,进行人脸识别,若是同一个人,得到uid, 设置为一样
|
|
|
- String uid = relevanceBeforeFace(idenFaceImage.getFeatPtr());
|
|
|
- if (StringUtils.isEmpty(uid)) {
|
|
|
- uid = UUID.randomUUID().toString();
|
|
|
- }
|
|
|
- idenFaceImage.setUid(uid);
|
|
|
+ //把图像存到图库中
|
|
|
+ if (CollUtil.isNotEmpty(idenFaceImageList)) {
|
|
|
+ idenFaceImageService.saveBatch(idenFaceImageList);
|
|
|
}
|
|
|
- idenFaceImage.setCreateTime(new Date());
|
|
|
- idenFaceImageList.add(idenFaceImage);
|
|
|
- }
|
|
|
|
|
|
- //把图像存到图库中
|
|
|
- if (CollUtil.isNotEmpty(idenFaceImageList)) {
|
|
|
- idenFaceImageService.saveBatch(idenFaceImageList);
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
+ } finally {
|
|
|
+ //释放人脸引擎
|
|
|
+ FaceIdenTool.releaseEngine(faceMonitorPerson);
|
|
|
}
|
|
|
- //释放人脸引擎
|
|
|
- FaceIdenTool.releaseEngine(faceMonitorPerson);
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
logger.info("FaceIdenService.handleCameraImage end");
|