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;
/**
* 虹軟人臉識(shí)別
* 用于 檢測(cè)上傳頭像圖片是否是 人臉
* 不是 終止上傳 返回提示信息
* */
@Service
public class FaceEngineService {
private static final Logger LOGGER = LoggerFactory.getLogger(FaceEngineService.class);
/* 下面是在獲取 虹軟人臉識(shí)別第三方的配置信息 */
@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初始化完成后 執(zhí)行 init方法
public void init() {
// 激活并且初始化引擎
// 下面的代碼是將 虹軟官方提供的代碼做封裝 就直接將人臉識(shí)別代碼段拷貝
// 此代碼在紅軟下載SDK 的 ArcSoft_ArcFace_Java_windows_x64_V3.0samplecode 里
// 要下載虹軟SDK window 和 linux 兩種系統(tǒng)中運(yùn)行的版本
// 每個(gè)項(xiàng)目都得注冊(cè)新的SDK 進(jìn)行下載 并注冊(cè)新用戶 將用戶信息配置到 springboot配置文件中
// 人臉識(shí)別技術(shù)采用虹軟開放平臺(tái)實(shí)現(xiàn)(免費(fèi)的)。官網(wǎng):https://www.arcsoft.com.cn/
// 使用虹軟平臺(tái)需要先注冊(cè)開發(fā)者賬號(hào):https://ai.arcsoft.com.cn/ucenter/user/userlogin
/**
* 進(jìn)入到libs目錄,需要將arcsoft-sdk-face-3.0.0.0.jar安裝到本地倉(cāng)庫:
* 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坐標(biāo)引用了:
*
* <dependency>
* <groupId>com.arcsoft.face</groupId>
* <artifactId>arcsoft-sdk-face</artifactId>
* <version>3.0.0.0</version>
* <!--<scope>system</scope>-->
* <!--如果沒有安裝到本地倉(cāng)庫,可以將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檢測(cè)模式,用于處理單張的圖像數(shù)據(jù)
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
//人臉檢測(cè)角度,全角度
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("初始化引擎出錯(cuò)!");
throw new RuntimeException("初始化引擎出錯(cuò)!");
}
this.faceEngine = faceEngine;
}
/**
* 檢測(cè)圖片是否為人像
*
* @param imageInfo 圖像對(duì)象
* @return true:人像,false:非人像
*/
public boolean checkIsPortrait(ImageInfo imageInfo) {
/*
* 這些都是紅軟提供的對(duì)象
* 需要自己定義下面 判斷 用于返回?cái)?shù)據(jù)的操作
* */
// 定義人臉列表
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
// faceEngine.detectFaces 檢測(cè)人臉核心方法
faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList);
return !faceInfoList.isEmpty();
// 取反值判斷 檢測(cè)到圖片中人臉不為空,表明圖片有人臉
}
public boolean checkIsPortrait(byte[] imageData) {
return this.checkIsPortrait(ImageFactory.getRGBData(imageData));
}
public boolean checkIsPortrait(File file) {
return this.checkIsPortrait(ImageFactory.getRGBData(file));
}
}