import com.arcsoft.face.EngineConfiguration;
import com.arcsoft.face.FaceEngine;
import com.arcsoft.face.FaceInfo;
import com.arcsoft.face.FunctionConfiguration;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import JAVAx.annotation.PostConstruct;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* 虹软人脸识别
* 用于 检测上传头像图片是否是 人脸
* 不是 终止上传 返回提示信息
* */
@Service
public class FaceEngineService {
private static final Logger LOGGER = LoggerFactory.getLogger(FaceEngineService.class);
/* 下面是在获取 虹软人脸识别第三方的配置信息 */
@Value("${arcsoft.Appid}")
private String appid;
@Value("${arcsoft.sdkKey}")
private String sdkKey;
@Value("${arcsoft.libPath}")
private String libPath;
private FaceEngine faceEngine;
@PostConstruct //这里作init初始化 @PostConstruct作用 在springboot中所有Bean初始化完成后 执行 init方法
public void init() {
// 激活并且初始化引擎
// 下面的代码是将 虹软官方提供的代码做封装 就直接将人脸识别代码段拷贝
// 此代码在红软下载SDK 的 ArcSoft_ArcFace_Java_windows_x64_V3.0samplecode 里
// 要下载虹软SDK window 和 linux 两种系统中运行的版本
// 每个项目都得注册新的SDK 进行下载 并注册新用户 将用户信息配置到 springboot配置文件中
// 人脸识别技术采用虹软开放平台实现(免费的)。官网:https://www.arcsoft.com.cn/
// 使用虹软平台需要先注册开发者账号:https://ai.arcsoft.com.cn/ucenter/user/userlogin
/**
* 进入到libs目录,需要将arcsoft-sdk-face-3.0.0.0.jar安装到本地仓库:
* mvn install:install-file -DgroupId=com.arcsoft.face -DartifactId=arcsoft-sdk-face -Dversion=3.0.0.0 -Dpackaging=jar -Dfile=arcsoft-sdk-face-3.0.0.0.jar
* 安装成功后,即可通过maven坐标引用了:
*
* <dependency>
* <groupId>com.arcsoft.face</groupId>
* <artifactId>arcsoft-sdk-face</artifactId>
* <version>3.0.0.0</version>
* <!--<scope>system</scope>-->
* <!--如果没有安装到本地仓库,可以将jar包拷贝到工程的lib下面下,直接引用-->
* <!--<systemPath>${project.basedir}/lib/arcsoft-sdk-face-3.0.0.0.jar</systemPath>-->
* </dependency>
* */
FaceEngine faceEngine = new FaceEngine(libPath);
int activeCode = faceEngine.activeOnline(appid, sdkKey);
if (activeCode != ErrorInfo.MOK.getValue() && activeCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
LOGGER.error("引擎激活失败");
throw new RuntimeException("引擎激活失败");
}
//引擎配置
EngineConfiguration engineConfiguration = new EngineConfiguration();
//IMAGE检测模式,用于处理单张的图像数据
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
//人脸检测角度,全角度
engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
//功能配置
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);
//初始化引擎
int initCode = faceEngine.init(engineConfiguration);
if (initCode != ErrorInfo.MOK.getValue()) {
LOGGER.error("初始化引擎出错!");
throw new RuntimeException("初始化引擎出错!");
}
this.faceEngine = faceEngine;
}
/**
* 检测图片是否为人像
*
* @param imageInfo 图像对象
* @return true:人像,false:非人像
*/
public boolean checkIsPortrait(ImageInfo imageInfo) {
/*
* 这些都是红软提供的对象
* 需要自己定义下面 判断 用于返回数据的操作
* */
// 定义人脸列表
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
// faceEngine.detectFaces 检测人脸核心方法
faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList);
return !faceInfoList.isEmpty();
// 取反值判断 检测到图片中人脸不为空,表明图片有人脸
}
public boolean checkIsPortrait(byte[] imageData) {
return this.checkIsPortrait(ImageFactory.getRGBData(imageData));
}
public boolean checkIsPortrait(File file) {
return this.checkIsPortrait(ImageFactory.getRGBData(file));
}
}