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