package com.doria.realFace.core;
import com.arcsoft.face.*;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectModel;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import com.arcsoft.face.toolkit.ImageInfo;
import com.arcsoft.face.toolkit.ImageInfoEx;
import com.doria.realFace.constant.HongRuan;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
public class HongRuanUtils {
public static void main(String[] args) {
//String faceA="C:\\Users\\Administrator.User-2020PERFCJ\\Desktop\\face\\kb1.bmp";
//String faceB="C:\\Users\\Administrator.User-2020PERFCJ\\Desktop\\face\\kb2.bmp";
String faceA= HongRuan.TEST_FACE_B;
String faceB= HongRuan.TEST_FACE_A;
int errorCode;
// 加载引擎
FaceEngine faceEngine = activeEngine();
ImageInfo imageInfoA = getRGBData(new File(faceA));
ImageInfo imageInfoB = getRGBData(new File(faceB));
// 人脸提取
List<FaceInfo> faceInfoList = new ArrayList<>();
faceInfoList=checkAndGetFace(faceEngine, imageInfoA,faceInfoList);
faceInfoList=checkAndGetFace(faceEngine, imageInfoB,faceInfoList);
// 获取人脸数据
byte[] faceByteA = extractFacialFeatures(faceEngine, imageInfoA, faceInfoList);
byte[] faceByteB = extractFacialFeatures(faceEngine, imageInfoB, faceInfoList);
// 根据byte数据生成人脸特征对象
FaceFeature faceFeatureA = new FaceFeature();
faceFeatureA.setFeatureData(faceByteA);
FaceFeature faceFeatureB = new FaceFeature();
faceFeatureB.setFeatureData(faceByteB);
// 进行人脸特征对比
FaceSimilar faceSimilar = faceComparison(faceEngine, faceFeatureA, faceFeatureB);
System.out.println("相似度:"+faceSimilar.getScore());
// 引擎卸载
errorCode = faceEngine.unInit();
System.out.println("errorCode:"+errorCode);
}
public static FaceEngine activeEngine(){
int errorCode;
FaceEngine faceEngine = new FaceEngine("E:\\Project\\demo\\ArcSoftFace\\src\\main\\resources\\WIN64");
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;
}
// 检查并获取人脸
public static List<FaceInfo> checkAndGetFace(FaceEngine faceEngine, ImageInfo imageInfo,List<FaceInfo> faceInfoList){
// 获取人脸数据并填入人脸集合
int errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
return faceInfoList;
}
// 提取人脸特征
public static byte[] extractFacialFeatures(FaceEngine faceEngine,ImageInfo imageInfo,List<FaceInfo> faceInfoList){
int errorCode;
//特征提取
FaceFeature faceFeature = new FaceFeature();
errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
// 提取到的特征值
byte[] faceASeat = faceFeature.getFeatureData();
System.out.println("人脸一特征值:"+ Arrays.asList(faceASeat));
return faceASeat;
}
// 人脸比对
public static FaceSimilar faceComparison(FaceEngine faceEngine,FaceFeature faceA,FaceFeature faceB){
// 创建脸a
FaceFeature faceFeatureA = new FaceFeature();
faceFeatureA.setFeatureData(faceA.getFeatureData());
// 创建脸b
FaceFeature faceFeatureB = new FaceFeature();
faceFeatureB.setFeatureData(faceB.getFeatureData());
// 创建结果
FaceSimilar faceSimilar = new FaceSimilar();
// 人脸比对
int errCode = faceEngine.compareFaceFeature(faceFeatureA, faceFeatureB, faceSimilar);
return faceSimilar;
}
// 活体检测
public static void livenessDetection(FaceEngine faceEngine,ImageInfo imageInfo,List<FaceInfo> faceInfoList){
// 设置活体测试
int errorCode = faceEngine.setLivenessParam(0.5f, 0.7f);
// 顺便进行人脸属性检测
FunctionConfiguration configuration = new FunctionConfiguration();
configuration.setSupportAge(true); // 检测年龄
configuration.setSupportFace3dAngle(true); // 检测3d
configuration.setSupportGender(true); // 检测性别
configuration.setSupportLiveness(true); // 检测活体
// 执行
errorCode = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, configuration);
//性别检测
List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();
errorCode = faceEngine.getGender(genderInfoList);
System.out.println("性别:" + genderInfoList.get(0).getGender());
//年龄检测
List<AgeInfo> ageInfoList = new ArrayList<AgeInfo>();
errorCode = faceEngine.getAge(ageInfoList);
System.out.println("年龄:" + ageInfoList.get(0).getAge());
//3D信息检测
List<Face3DAngle> face3DAngleList = new ArrayList<Face3DAngle>();
errorCode = faceEngine.getFace3DAngle(face3DAngleList);
System.out.println("3D角度:" + face3DAngleList.get(0).getPitch() + "," + face3DAngleList.get(0).getRoll() + "," + face3DAngleList.get(0).getYaw());
//活体检测
List<LivenessInfo> livenessInfoList = new ArrayList<LivenessInfo>();
errorCode = faceEngine.getLiveness(livenessInfoList);
System.out.println("活体:" + livenessInfoList.get(0).getLiveness());
}
// IR活体检测
public static void irLivenessCheck(FaceEngine faceEngine, ImageInfo imageInfo,FunctionConfiguration functionConfiguration){
// 开启IR支持
functionConfiguration.setSupportIRLiveness(true);
List<IrLivenessInfo> irLivenessInfo = new ArrayList<>();
int errorCode = faceEngine.getLivenessIr(irLivenessInfo);
System.out.println("IR活体:" + irLivenessInfo.get(0).getLiveness());
ImageInfoEx imageInfoEx = new ImageInfoEx();
imageInfoEx.setHeight(imageInfo.getHeight());
imageInfoEx.setWidth(imageInfo.getWidth());
imageInfoEx.setImageFormat(imageInfo.getImageFormat());
imageInfoEx.setImageDataPlanes(new byte[][]{imageInfo.getImageData()});
imageInfoEx.setImageStrides(new int[]{imageInfo.getWidth() * 3});
List<FaceInfo> faceInfoList1 = new ArrayList<>();
errorCode = faceEngine.detectFaces(imageInfoEx, DetectModel.ASF_DETECT_MODEL_RGB, faceInfoList1);
FunctionConfiguration fun = new FunctionConfiguration();
fun.setSupportAge(true);
errorCode = faceEngine.process(imageInfoEx, faceInfoList1, functionConfiguration);
List<AgeInfo> ageInfoList1 = new ArrayList<>();
int age = faceEngine.getAge(ageInfoList1);
System.out.println("年龄:" + ageInfoList1.get(0).getAge());
FaceFeature feature = new FaceFeature();
errorCode = faceEngine.extractFaceFeature(imageInfoEx, faceInfoList1.get(0), feature);
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交