3 changed files with 183 additions and 2 deletions
@ -0,0 +1,157 @@ |
|||||
|
package yq.common.utils; |
||||
|
|
||||
|
|
||||
|
import cn.hutool.core.collection.CollectionUtil; |
||||
|
import com.arcsoft.face.*; |
||||
|
import com.arcsoft.face.enums.DetectMode; |
||||
|
import com.arcsoft.face.enums.DetectOrient; |
||||
|
import com.arcsoft.face.enums.ErrorInfo; |
||||
|
import com.arcsoft.face.enums.ImageFormat; |
||||
|
import com.arcsoft.face.toolkit.ImageFactory; |
||||
|
import com.arcsoft.face.toolkit.ImageInfo; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.web.multipart.MultipartFile; |
||||
|
import yq.common.exception.ServiceException; |
||||
|
import yq.common.utils.file.ImageUtils; |
||||
|
|
||||
|
import javax.imageio.ImageIO; |
||||
|
import java.awt.image.BufferedImage; |
||||
|
import java.io.IOException; |
||||
|
import java.io.InputStream; |
||||
|
import java.util.ArrayList; |
||||
|
import java.util.List; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* minio文件上传工具类 |
||||
|
* @author: jeecg-boot |
||||
|
*/ |
||||
|
@Slf4j |
||||
|
public class FaceEnginUtil { |
||||
|
@Value(value = "${arcsoft.appId}") |
||||
|
private static String appId; |
||||
|
|
||||
|
@Value(value = "${arcsoft.sdkKey}") |
||||
|
private static String sdkKey; |
||||
|
|
||||
|
|
||||
|
@Value(value = "${arcsoft.faceEngine}") |
||||
|
private static String faceEngineUrl; |
||||
|
|
||||
|
|
||||
|
public static FaceEngine init() { |
||||
|
FaceEngine faceEngine = new FaceEngine(faceEngineUrl); |
||||
|
//激活引擎
|
||||
|
int errorCode = faceEngine.activeOnline(appId, sdkKey); |
||||
|
|
||||
|
if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) { |
||||
|
System.out.println("引擎激活失败"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
ActiveFileInfo activeFileInfo=new ActiveFileInfo(); |
||||
|
errorCode = faceEngine.getActiveFileInfo(activeFileInfo); |
||||
|
if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) { |
||||
|
System.out.println("获取激活文件信息失败"); |
||||
|
} |
||||
|
|
||||
|
//引擎配置
|
||||
|
EngineConfiguration engineConfiguration = new EngineConfiguration(); |
||||
|
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE); |
||||
|
engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT); |
||||
|
engineConfiguration.setDetectFaceMaxNum(10); |
||||
|
engineConfiguration.setDetectFaceScaleVal(16); |
||||
|
//功能配置
|
||||
|
FunctionConfiguration functionConfiguration = new FunctionConfiguration(); |
||||
|
functionConfiguration.setSupportAge(true); |
||||
|
functionConfiguration.setSupportFace3dAngle(true); |
||||
|
functionConfiguration.setSupportFaceDetect(true); |
||||
|
functionConfiguration.setSupportFaceRecognition(true); |
||||
|
functionConfiguration.setSupportGender(true); |
||||
|
functionConfiguration.setSupportLiveness(true); |
||||
|
functionConfiguration.setSupportIRLiveness(true); |
||||
|
engineConfiguration.setFunctionConfiguration(functionConfiguration); |
||||
|
|
||||
|
|
||||
|
//初始化引擎
|
||||
|
errorCode = faceEngine.init(engineConfiguration); |
||||
|
|
||||
|
if (errorCode != ErrorInfo.MOK.getValue()) { |
||||
|
System.out.println("初始化引擎失败"); |
||||
|
} |
||||
|
return faceEngine; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 录入人脸接口存入byte数组特征值 |
||||
|
* @param file |
||||
|
* @return |
||||
|
*/ |
||||
|
public static byte[] uploadInput(MultipartFile file) { |
||||
|
FaceEngine faceEngine = FaceEnginUtil.init(); |
||||
|
InputStream inputstream = null; |
||||
|
ImageInfo imageInfo = null; |
||||
|
try { |
||||
|
inputstream = file.getInputStream(); |
||||
|
imageInfo = ImageFactory.getRGBData(inputstream); |
||||
|
if (inputstream != null) { |
||||
|
inputstream.close(); |
||||
|
} |
||||
|
} catch (IOException e) { |
||||
|
throw new ServiceException("文件非图像类型"); |
||||
|
} |
||||
|
|
||||
|
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>(); |
||||
|
faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList); |
||||
|
//特征提取
|
||||
|
FaceFeature faceFeature = new FaceFeature(); |
||||
|
faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature); |
||||
|
byte[] featureData = faceFeature.getFeatureData(); |
||||
|
FaceEnginUtil.close(faceEngine); |
||||
|
return featureData; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 人脸匹配 |
||||
|
* @param file 人脸数据 |
||||
|
* @param faceFeature1 数据库人脸存根 |
||||
|
* @return float 数据判断大于0.7以上 |
||||
|
*/ |
||||
|
public static float uploadContrast(MultipartFile file,Byte[] faceFeature1) { |
||||
|
FaceEngine faceEngine = FaceEnginUtil.init(); |
||||
|
InputStream inputstream = null; |
||||
|
ImageInfo imageInfo = null; |
||||
|
try { |
||||
|
inputstream = file.getInputStream(); |
||||
|
imageInfo = ImageFactory.getRGBData(inputstream); |
||||
|
if (inputstream != null) { |
||||
|
inputstream.close(); |
||||
|
} |
||||
|
} catch (IOException e) { |
||||
|
throw new ServiceException("文件非图像类型"); |
||||
|
} |
||||
|
|
||||
|
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>(); |
||||
|
faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList); |
||||
|
//特征提取
|
||||
|
FaceFeature faceFeature = new FaceFeature(); |
||||
|
faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature); |
||||
|
byte[] featureData = faceFeature.getFeatureData(); |
||||
|
//特征比对
|
||||
|
FaceFeature targetFaceFeature = new FaceFeature(); |
||||
|
targetFaceFeature.setFeatureData(featureData); |
||||
|
FaceFeature sourceFaceFeature = new FaceFeature(); |
||||
|
sourceFaceFeature.setFeatureData(faceFeature.getFeatureData()); |
||||
|
FaceSimilar faceSimilar = new FaceSimilar(); |
||||
|
faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar); |
||||
|
FaceEnginUtil.close(faceEngine); |
||||
|
return faceSimilar.getScore(); |
||||
|
} |
||||
|
|
||||
|
public static void close(FaceEngine faceEngine) { |
||||
|
faceEngine.unInit(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
Loading…
Reference in new issue