FaceUtils -人脸采集工具-springboot+vue企业排班
分类: springboot vue 专栏: springboot+vue企业排班人脸批量热力图 标签: FaceUtils
2026-02-23 15:00:22 51浏览
FaceUtils
package www.jf3q.com.utils.face;
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.toolkit.ImageInfo;
import lombok.Data;
import org.apache.commons.lang.time.DateUtils;
import www.jf3q.com.bean.ScEmployees;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
import static com.arcsoft.face.toolkit.ImageFactory.getGrayData;
@Data
public class FaceUtils {
public static String appId = "xxx";
public static String sdkKey= "xxx";
public static String dllPath ="D:/WIN64";
/**
* 初始化
*/
public static FaceEngine getFaceEngine() {
FaceEngine faceEngine = new FaceEngine(dllPath);
//激活引擎
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;
}
/**
* 获取一张照片的特征值
* @param bytes
* @return
*/
public static FaceData getFaceData(byte[] bytes,String base64img,boolean needalive){
FaceData faceData = new FaceData();
//人脸检测
ImageInfo imageInfo = getRGBData(bytes);
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
FaceEngine faceEngine = FaceUtils.getFaceEngine();
int errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
System.out.println("人脸检测状态码:"+errorCode);
faceData.setValidateFace(errorCode);
if(faceInfoList.size()==0) {
faceData.setValidateFace(-1);
return faceData;
}
//特征提取
FaceFeature faceFeature = new FaceFeature();
int code=faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
System.out.println("特征值状态码:" + code);
faceData.setFaceData(faceFeature.getFeatureData());
if(needalive){
//设置活体测试
errorCode = faceEngine.setLivenessParam(0.5f, 0.7f);
//人脸属性检测
FunctionConfiguration configuration = new FunctionConfiguration();
configuration.setSupportLiveness(true);
errorCode = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, configuration);
System.out.println("IR活体检测状态码:"+errorCode);
String htimg="D:\\ht"+ UUID.randomUUID().toString()+".jpg";
boolean boo_htimg=ImageUtils.Base64ToImage(base64img,htimg);
//IR属性处理
ImageInfo imageInfoGray = getGrayData(new File(htimg));
List<FaceInfo> faceInfoListGray = new ArrayList<FaceInfo>();
errorCode = faceEngine.detectFaces(imageInfoGray.getImageData(), imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray);
System.out.println("IR活体检测2状态码:"+errorCode);
FunctionConfiguration configuration2 = new FunctionConfiguration();
configuration2.setSupportIRLiveness(true);
errorCode = faceEngine.processIr(imageInfoGray.getImageData(), imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray, configuration2);
System.out.println("IR活体检测3状态码:"+errorCode);
//IR活体检测
List<IrLivenessInfo> irLivenessInfo = new ArrayList<>();
errorCode = faceEngine.getLivenessIr(irLivenessInfo);
System.out.println("IR活体检测4状态码:"+errorCode);
int islive=0;
if(irLivenessInfo!=null&&irLivenessInfo.size()>0){
//irLivenessInfo.get(0).getLiveness() IR活体值,未知=-1 、非活体=0 、活体=1、超出人脸=-2
islive=irLivenessInfo.get(0).getLiveness();
System.out.println("IR活体:" + islive+"(未知=-1 、非活体=0 、活体=1、超出人脸=-2)");
}
if(islive==1)faceData.setValidatePoint(0);
else faceData.setValidatePoint(-101);
File f=new File(htimg);
f.delete();
}else{
faceData.setValidatePoint(code);
}
//引擎卸载
faceEngine.unInit();
return faceData;
}
/**
* 特征值比对(返回相似度)
* @param sources
* @param target
* @return
*/
public static CompareFace compare(byte[] sources,byte[] target){
CompareFace compareFace = new CompareFace();
FaceFeature targetFaceFeature = new FaceFeature();
targetFaceFeature.setFeatureData(target);
FaceFeature sourceFaceFeature = new FaceFeature();
sourceFaceFeature.setFeatureData(sources);
FaceSimilar faceSimilar = new FaceSimilar();
FaceEngine faceEngine = FaceUtils.getFaceEngine();
int scoreCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
System.out.println("相似度状态码:"+scoreCode);
compareFace.setScoreCode(scoreCode);
compareFace.setScore(faceSimilar.getScore());
//引擎卸载
faceEngine.unInit();
return compareFace;
}
}
package www.jf3q.com.utils.face;
import org.springframework.util.Base64Utils;
import sun.misc.BASE64Decoder;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class ImageUtils {
public static byte[] base64ToByte(String baseStr){
if (baseStr == null){
return null;
}
BASE64Decoder decoder = new BASE64Decoder();
try {
// 解密
byte[] b = decoder.decodeBuffer(baseStr);
// 处理数据
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {
b[i] += 256;
}
}
return b;
} catch (Exception e) {
return null;
}
}
/**
* base64字符串转换成图片 (对字节数组字符串进行Base64解码并生成图片)
* @param imgStr base64字符串
* @param imgFilePath 指定图片存放路径 (注意:带文件名)
* @return
*/
public static boolean Base64ToImage(String imgStr,String imgFilePath) {
if (imgStr == null) { // 图像数据为空
return false;
}
try {
// Base64解码
byte[] b = Base64Utils.decodeFromString(imgStr);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {// 调整异常数据
b[i] += 256;
}
}
OutputStream out = new FileOutputStream(imgFilePath);
out.write(b);
out.flush();
out.close();
return true;
} catch (Exception e) {
return false;
}
}
}
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
暂无评论,快来写一下吧
展开评论
您可能感兴趣的博客
他的专栏
他感兴趣的技术

java
vue
springboot
Mysql
ssm
小程序
uniapp
js和jquery