北屋教程网

专注编程知识分享,从入门到精通的编程学习平台

物联网系统架构(11)java开发人脸采集系统

本文主要是分享java开发人脸采集系统,主要是springboot导入虹软开放平台,并使用阿里云OSS系统上传图片。

原文地址:

Java进阶实战:人脸采集识别系统项目完整公开分享_java人脸识别开源项目-CSDN博客

一,人脸采集

1.1,下载虹软SDK

人脸识别技术采用虹软开放平台实现(免费使用)。官网:
https://www.arcsoft.com.cn/

使用虹软平台需要先注册开发者账号:
https://ai.arcsoft.com.cn/ucenter/user/userlogin

注册完成后进行登录,然后进行创建应用。

创建应用完成后,需要进行实名认证,否则相关的SDK是不能使用的。
实名认证后即可选择对应平台的SDk,我们需要选择windows以及linux平台。

最后就可以下载对应的SDK到本地。

下载SDK,打开解压包,可以看到有提供相应的jar包以及示例代码:

每个账号的SDK包不通用,所以自己要下载自己的SDK包。

1.2、安装jar到本地仓库
进入到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>

1.3、开始使用

说明:虹软的SDK是免费使用的,但是首次使用时需要联网激活,激活后可离线使用。使用周期为1年,1年后需要联网再次激活。个人免费激活SDK总数量为100。

配置:application.properties

#虹软相关配置(在虹软应用中找到对应的参数)
arcsoft.appid=******************
arcsoft.sdkKey=*****************
arcsoft.libPath=F:\\code\\WIN64

主要核心类FaceEngineService,重点方法是checkIsPortrait(File file)

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
    public void init() {
        // 激活并且初始化引擎
        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(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(MultipartFile multipartFile) {
        try{
            return this.checkIsPortrait(ImageFactory.getRGBData(multipartFile.getBytes()));
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;

    }

    public boolean checkIsPortrait(File file) {
        return this.checkIsPortrait(ImageFactory.getRGBData(file));
    }

}

1.4、测试,重点测试方法是checkIsPortrait(File file)

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.io.File;

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class TestFaceEngineService {

    @Autowired
    private  FaceEngineService   faceEngineService;

    @Test
    public void testCheckIsPortrait(){
        File file = new File("F:\\1.jpg");
        boolean checkIsPortrait = this.faceEngineService.checkIsPortrait(file);
        System.out.println(checkIsPortrait); // true|false
    }
}

二,图片上传使用的是阿里的OSS

2.1,首先创建阿里OSS云存储的账号,最后申请使用权限。

2.2、导入OSS依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>2.8.3</version>
</dependency>

2.3、OSS配置

aliyun.properties:

aliyun.endpoint = http://oss-cn-beijing.aliyuncs.com
aliyun.accessKeyId = LTAI5tKy8djwYHDaQ3QjpcKJ
aliyun.accessKeySecret = hYSDMNLsEIOqdjsnPtIlzmnfdWB0y11
aliyun.bucketName= itcast-face
aliyun.urlPrefix=http://itcast-face.oss-cn-beijing.aliyuncs.com

AliyunConfig:


import com.aliyun.oss.OSSClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration
@PropertySource("classpath:aliyun.properties")
@ConfigurationProperties(prefix = "aliyun")
@Data
public class AliyunConfig {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
    private String urlPrefix;

    @Bean
    public OSSClient oSSClient() {
        return new OSSClient(endpoint, accessKeyId, accessKeySecret);
    }

}

2.4、图片上传到阿里云OSS的核心类PicUploadService主要方法upload(MultipartFile uploadFile)


import com.aliyun.oss.OSSClient;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;

@Service
public class PicUploadService {

    // 允许上传的格式
    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
            ".jpeg", ".gif", ".png"};

    @Autowired
    private OSSClient ossClient;

    @Autowired
    private AliyunConfig aliyunConfig;

    public PicUploadResult upload(MultipartFile uploadFile) {

        PicUploadResult fileUploadResult = new PicUploadResult();

        //图片做校验,对后缀名
        boolean isLegal = false;

        for (String type : IMAGE_TYPE) {
            if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(),
                    type)) {
                isLegal = true;
                break;
            }
        }

        if (!isLegal) {
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }

        // 文件新路径
        String fileName = uploadFile.getOriginalFilename();
        String filePath = getFilePath(fileName);

        // 上传到阿里云
        try {
            // 目录结构:images/2018/12/29/xxxx.jpg
            ossClient.putObject(aliyunConfig.getBucketName(), filePath, new
                    ByteArrayInputStream(uploadFile.getBytes()));
        } catch (Exception e) {
            e.printStackTrace();
            //上传失败
            fileUploadResult.setStatus("error");
            return fileUploadResult;
        }

        // 上传成功
        fileUploadResult.setStatus("done");
        fileUploadResult.setName(this.aliyunConfig.getUrlPrefix() + filePath);
        fileUploadResult.setUid(String.valueOf(System.currentTimeMillis()));

        return fileUploadResult;
    }

    private String getFilePath(String sourceFileName) {
        DateTime dateTime = new DateTime();
       return "/images/" + dateTime.toString("yyyy")
                + "/" + dateTime.toString("MM") + "/"
                + dateTime.toString("dd") + "/" + System.currentTimeMillis() +
                RandomUtils.nextInt(100, 9999) + "." +
                StringUtils.substringAfterLast(sourceFileName, ".");
    }

}

PicUploadResult:


import lombok.Data;

@Data
public class PicUploadResult {

    // 文件唯一标识
    private String uid;
    // 文件名
    private String name;
    // 状态有:uploading done error removed
    private String status;
    // 服务端响应内容,如:'{"status": "success"}'
    private String response;

}

2.5、PicUploadController主要使用的是PicUploadService.upload()


import com.tanhua.sso.service.PicUploadService;
import com.tanhua.sso.vo.PicUploadResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

@RequestMapping("pic/upload")
@Controller
public class PicUploadController {

    @Autowired
    private PicUploadService picUploadService;

    @PostMapping
    @ResponseBody
    public PicUploadResult upload(@RequestParam("file") MultipartFile multipartFile) {
        return this.picUploadService.upload(multipartFile);
    }
}


三,最终人脸采集系统搭建

3.1导入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>1.18.4</version>
        </dependency>

       

        <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>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
        </dependency>

        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.9.9</version>
        </dependency>

        <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.7</version>
    </dependency>
</dependencies>

3.2 配置文件

aliyun.properties
          aliyun.endpoint = http://oss-cn-beijing.aliyuncs.com
          aliyun.accessKeyId = LTAI5tKy8djwYHDaQ3QjpcKJ
          aliyun.accessKeySecret = hYSDMNLsEIOqdjsnPtIlzmnfdWB0y1
          aliyun.bucketName= itcast-face
          aliyun.urlPrefix=http://itcast-face.oss-cn-beijing.aliyuncs.com
          
application.properties 虹软配置
        #虹软相关配置
        arcsoft.appid=AunLcwhQm4sk4vbsNdPotg1G9cughEUnom5jF63jsqsW
        arcsoft.sdkKey=7mB6wNGYFAGuTiL8k2MGKsvQRHrHWkJ4jYZnqqLvGjbS
        arcsoft.libPath=E:\\code\\WIN64

3.3 编写controller

import com.itheima.service.FaceCollectService;
import com.itheima.vo.PictureVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

@RequestMapping("head/collect")
@Controller
public class FaceCollectController {

    @Autowired
    private FaceCollectService faceCollectService;

    @PostMapping
    @ResponseBody
    public PictureVo upload(@RequestParam("file") MultipartFile multipartFile) {

        return this.faceCollectService.upload(multipartFile);
    }
}

3.4 编写service,先使用FaceEngineService.checkIsPortrait(File file)检查是否为人脸图片,然后再使用PicUploadService.upload()

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

@Service
public class FaceCollectService {

    @Autowired
    private FaceEngineService faceEngineService;
    @Autowired
    private PicUploadService picUploadService;

    public PicUploadResult upload(MultipartFile multipartFile) {
        PicUploadResult fileUploadResult = new PicUploadResult();
        boolean result = this.faceEngineService.checkIsPortrait(multipartFile);
        if (!result) {
            fileUploadResult.setStatus("error");
            fileUploadResult.setResponse("非人脸头像!");
            return fileUploadResult;
        }
        //图片上传到阿里云OSS
        fileUploadResult = this.picUploadService.upload(multipartFile);
        return fileUploadResult;
    }
}

3.5启动测试

上传非人脸头像:

上传人脸头像:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言