|
|
@@ -6,7 +6,6 @@ import com.arcsoft.face.enums.ExtractType;
|
|
|
import com.arcsoft.face.toolkit.ImageFactory;
|
|
|
import com.arcsoft.face.toolkit.ImageInfo;
|
|
|
import com.doc.common.core.domain.entity.SysUserExpand;
|
|
|
-import com.doc.common.utils.SecurityUtils;
|
|
|
import com.doc.common.utils.sign.Base64;
|
|
|
import com.doc.face.init.FaceEngineInit;
|
|
|
import com.doc.face.service.IFaceService;
|
|
|
@@ -15,7 +14,6 @@ import com.doc.system.service.ISysUserExpandService;
|
|
|
import javafx.util.Pair;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import javax.annotation.PostConstruct;
|
|
|
import javax.annotation.Resource;
|
|
|
import java.io.File;
|
|
|
import java.util.ArrayList;
|
|
|
@@ -34,40 +32,61 @@ public class FaceServiceImpl implements IFaceService {
|
|
|
@Resource
|
|
|
private ISysUserExpandService expandService;
|
|
|
|
|
|
- private FaceEngine faceEngine;
|
|
|
- private Boolean faceEnabled;
|
|
|
+ /**
|
|
|
+ * 获取face引擎
|
|
|
+ *
|
|
|
+ * @return engine
|
|
|
+ */
|
|
|
+ private FaceEngine faceEngine() {
|
|
|
+ return faceEngineInit.getFaceEngine();
|
|
|
+ }
|
|
|
|
|
|
- private Float score;
|
|
|
+ /**
|
|
|
+ * 获取是否开启人脸识别
|
|
|
+ *
|
|
|
+ * @return true/false
|
|
|
+ */
|
|
|
+ private Boolean faceEnabled() {
|
|
|
+ return faceEngineInit.getFaceEnabled();
|
|
|
+ }
|
|
|
|
|
|
- @PostConstruct
|
|
|
- public void init() {
|
|
|
- faceEngine = faceEngineInit.getFaceEngine();
|
|
|
- faceEnabled = faceEngineInit.getFaceEnabled();
|
|
|
- score = faceEngineInit.getScore();
|
|
|
+ /**
|
|
|
+ * 获取相似度分数标准
|
|
|
+ *
|
|
|
+ * @return score
|
|
|
+ */
|
|
|
+ private Float score() {
|
|
|
+ return faceEngineInit.getScore();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 人脸检测
|
|
|
*
|
|
|
- * @param file 人脸图片
|
|
|
+ * @param userId 用户ID
|
|
|
+ * @param file 人脸图片
|
|
|
* @return 返回是否检测到人脸
|
|
|
*/
|
|
|
@Override
|
|
|
- public boolean detectFaces(File file) {
|
|
|
- if (!faceEnabled) {
|
|
|
+ public boolean detectFaces(Long userId, File file) {
|
|
|
+ if (!faceEnabled()) {
|
|
|
return false;
|
|
|
}
|
|
|
+ boolean res = true;
|
|
|
+ SysUserExpand expand = new SysUserExpand();
|
|
|
+ expand.setUserId(userId);
|
|
|
+ //不管有没有,先删了再说
|
|
|
+ FaceEngineUtil.removeFaceFeature(faceEngine(), userId);
|
|
|
byte[] featureData = faceFeature(file);
|
|
|
if (featureData != null) {
|
|
|
String feature = Base64.encode(featureData);
|
|
|
- SysUserExpand expand = new SysUserExpand();
|
|
|
- expand.setUserId(SecurityUtils.getUserId());
|
|
|
expand.setFaceFeature(feature);
|
|
|
- expandService.updateSysUserExpand(expand);
|
|
|
- FaceEngineUtil.registerFaceFeature(faceEngine, expand);
|
|
|
- return true;
|
|
|
+ FaceEngineUtil.registerFaceFeature(faceEngine(), expand);
|
|
|
+ } else {
|
|
|
+ expand.setFaceFeature("");
|
|
|
+ res = false;
|
|
|
}
|
|
|
- return false;
|
|
|
+ expandService.updateSysUserExpand(expand);
|
|
|
+ return res;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -77,18 +96,18 @@ public class FaceServiceImpl implements IFaceService {
|
|
|
* @return 特征值
|
|
|
*/
|
|
|
private byte[] faceFeature(File file) {
|
|
|
- if (!faceEnabled) {
|
|
|
+ if (!faceEnabled()) {
|
|
|
return null;
|
|
|
}
|
|
|
ImageInfo imageInfo = ImageFactory.getRGBData(file);
|
|
|
List<FaceInfo> faceInfoList = new ArrayList<>();
|
|
|
- faceEngine.detectFaces(imageInfo, faceInfoList);
|
|
|
+ faceEngine().detectFaces(imageInfo, faceInfoList);
|
|
|
|
|
|
if (faceInfoList.size() == 1) {
|
|
|
//有且只有一个人脸信息时才提取特征值
|
|
|
//提取特征值
|
|
|
FaceFeature faceFeature = new FaceFeature();
|
|
|
- faceEngine.extractFaceFeature(imageInfo, faceInfoList.get(0), ExtractType.REGISTER, 0, faceFeature);
|
|
|
+ faceEngine().extractFaceFeature(imageInfo, faceInfoList.get(0), ExtractType.REGISTER, 0, faceFeature);
|
|
|
return faceFeature.getFeatureData();
|
|
|
} else {
|
|
|
return null;
|
|
|
@@ -103,7 +122,7 @@ public class FaceServiceImpl implements IFaceService {
|
|
|
*/
|
|
|
@Override
|
|
|
public Pair<Long, Float> searchFaces(File file) {
|
|
|
- if (!faceEnabled) {
|
|
|
+ if (!faceEnabled()) {
|
|
|
return null;
|
|
|
}
|
|
|
byte[] featureData = faceFeature(file);
|
|
|
@@ -111,18 +130,18 @@ public class FaceServiceImpl implements IFaceService {
|
|
|
FaceFeature faceFeature = new FaceFeature();
|
|
|
faceFeature.setFeatureData(featureData);
|
|
|
SearchResult searchResult = new SearchResult();
|
|
|
- faceEngine.searchFaceFeature(faceFeature, CompareModel.LIFE_PHOTO, searchResult);
|
|
|
- int userId = searchResult.getFaceFeatureInfo().getSearchId();
|
|
|
-
|
|
|
- //特征比对
|
|
|
- FaceSimilar faceSimilar = new FaceSimilar();
|
|
|
- FaceFeature targetFace = new FaceFeature();
|
|
|
- targetFace.setFeatureData(searchResult.getFaceFeatureInfo().getFeatureData());
|
|
|
- faceEngine.compareFaceFeature(faceFeature, targetFace, faceSimilar);
|
|
|
- return new Pair<>((long) userId, faceSimilar.getScore());
|
|
|
- } else {
|
|
|
- return null;
|
|
|
+ faceEngine().searchFaceFeature(faceFeature, CompareModel.LIFE_PHOTO, searchResult);
|
|
|
+ if (searchResult.getFaceFeatureInfo() != null) {
|
|
|
+ int userId = searchResult.getFaceFeatureInfo().getSearchId();
|
|
|
+ //特征比对
|
|
|
+ FaceSimilar faceSimilar = new FaceSimilar();
|
|
|
+ FaceFeature targetFace = new FaceFeature();
|
|
|
+ targetFace.setFeatureData(searchResult.getFaceFeatureInfo().getFeatureData());
|
|
|
+ faceEngine().compareFaceFeature(faceFeature, targetFace, faceSimilar);
|
|
|
+ return new Pair<>((long) userId, faceSimilar.getScore());
|
|
|
+ }
|
|
|
}
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -134,7 +153,7 @@ public class FaceServiceImpl implements IFaceService {
|
|
|
@Override
|
|
|
public Long faceLogin(File upFile) {
|
|
|
Pair<Long, Float> pair = searchFaces(upFile);
|
|
|
- if (pair != null && pair.getValue() > score) {
|
|
|
+ if (pair != null && pair.getValue() > score()) {
|
|
|
return pair.getKey();
|
|
|
} else {
|
|
|
return 0L;
|