<返回更多

人脸识别功能 参考代码 SDK service层 微服务架构

2022-06-05    独立TOKEN
加入收藏
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));
    }

}
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>