使用虹软SDK进行视频人脸识别

视频人脸识别系列

第一篇 使用openCV进行视频人脸识别
第二篇 使用虹软SDK进行视频人脸识别
第三篇 使用虹软SDK进行视频人脸比对



前言

发现了一个可以免费使用的人脸识别库,虹软SDK,高级功能是需要收费的,集成一个SDK看看效果。


一、环境依赖

开发环境

  • javaJdk 11
  • Apache Maven 3.8.4
  • 虹软 sdk java 3.0
  • IDEA 2021.3 CE 社区版

java 环境搭建见 第一篇 使用openCV进行视频人脸识别

申请虹软KEY

注册虹软账号,创建应用,选择对应平台后得到key,并下载SDK备用。
在这里插入图片描述

maven 项目集成虹软sdk

引入sdk库

在项目根目录创建 libs 库 将下载的虹软SDK解压把里面的 arcsoft-sdk-face-3.0.0.0.jar 放入 libs 目录。并把 WIN64 目录也放在该目录下或者把WIN64放在别的目录也可以。

在 pom.xml 添加引用
<dependencies>
	<!-- 虹软sdk -->
    <dependency>
      <groupId>com.arcsoft.face</groupId>
      <artifactId>arcsoft-sdk-face</artifactId>
      <version>3.0.0.0</version>
      <scope>system</scope>
      <systemPath>${basedir}/libs/arcsoft-sdk-face-3.0.0.0.jar</systemPath>
    </dependency>
	<!-- javaCV库 -->
    <dependency>
      <groupId>org.bytedeco</groupId>
      <artifactId>javacv-platform</artifactId>
      <version>1.5.7</version>
      <type>pom</type>
    </dependency>
  </dependencies>

二、使用虹软SDK进行人脸识别

在线激活SDK 和 获取授权文件信息
//从官网获取的key
        String appId = "给你分配的ID";
        String sdkKey = "你申请的key";
        String sdkLibPath = "D:\\javaworks\\faceDemo\\libs\\WIN64";

        //指定引擎依赖库
        FaceEngine faceEngine = new FaceEngine(sdkLibPath);
        //激活引擎
        int errorCode = faceEngine.activeOnline(appId, sdkKey);
        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            System.out.println("引擎激活失败");
            System.exit(2);
        }
        //获取激活文件
        ActiveFileInfo activeFileInfo=new ActiveFileInfo();
        errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            System.out.println("获取激活文件信息失败");
            System.exit(2);
        } 
初始化引擎
 //引擎配置
 EngineConfiguration engineConfiguration = new EngineConfiguration();
//        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
 engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_VIDEO);
 engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
//        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
 engineConfiguration.setDetectFaceMaxNum(10);
 engineConfiguration.setDetectFaceScaleVal(16); //视频推荐16 图片推荐32
 //功能配置
 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("初始化引擎失败");
     System.exit(2);
 }
从设备获取视频帧
//抓取摄像头
 grabber = new OpenCVFrameGrabber(0);
 // grabber.setFrameRate(24);
 grabber.setImageWidth(960);
 grabber.setImageHeight(540);
 grabber.start();
循环提取每帧图片上的人脸信息
//  frame = grabber.grabImage();
 frame = grabber.grab();

 IplImage iplImage = converter.convert(frame);
 byte[] imageData = new byte[iplImage.imageSize()];
 iplImage.imageData().get(imageData);

 //提取人脸信息
 List<FaceInfo> imageInfoList = new LinkedList<>();
 errorCode = faceEngine.detectFaces(imageData, iplImage.width(), iplImage.height(), ImageFormat.CP_PAF_BGR24, imageInfoList);
 int faceNum = imageInfoList.size();
人脸属性检查
//人脸属性检测
   FunctionConfiguration configuration = new FunctionConfiguration();
   configuration.setSupportAge(true);
   configuration.setSupportGender(true);
   errorCode = faceEngine.process(imageData, iplImage.width(), iplImage.height(), ImageFormat.CP_PAF_BGR24, imageInfoList, configuration);

   //性别检测
   List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();
   errorCode = faceEngine.getGender(genderInfoList);
   //年龄检测
   List<AgeInfo> ageInfoList = new ArrayList<AgeInfo>();
   errorCode = faceEngine.getAge(ageInfoList);
把人脸框出来
//人脸画框
         for(int i = 0; i<imageInfoList.size(); i++){
             int x = imageInfoList.get(i).getRect().getLeft();
             int y = imageInfoList.get(i).getRect().getTop();
             int xMax = imageInfoList.get(i).getRect().getRight();
             int yMax = imageInfoList.get(i).getRect().getBottom();
             int gender = genderInfoList.size()>0 ? genderInfoList.get(i).getGender() : -1;
             int age = ageInfoList.size()>0 ? ageInfoList.get(i).getAge() : -1;
             String info = gender + ":" + age;
             CvScalar cvScalar = cvScalar(0,0,255,0);
             CvPoint cvPoint =  cvPoint(x,y);
             CvPoint cvPoint1 = cvPoint(xMax,yMax);
             opencv_imgproc.cvRectangle(iplImage, cvPoint, cvPoint1,cvScalar,1,4,0);
             //中文显示乱码不知道怎么办 有知道的请指教谢谢
             opencv_imgproc.cvPutText(iplImage,info,cvPoint(xMax,y+10),cvFont(1.0),cvScalar);
         }
         
 //图片刷新到窗口
 frame = converter.convert(iplImage);
 canvasFrame.showImage(frame);

来个完整的

package com.sxfenglei;

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.enums.ImageFormat;
import org.bytedeco.javacv.*;
import org.bytedeco.opencv.global.opencv_imgproc;
import org.bytedeco.opencv.opencv_core.*;
import javax.swing.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import static org.bytedeco.opencv.global.opencv_core.cvPoint;
import static org.bytedeco.opencv.global.opencv_core.cvScalar;
import static org.bytedeco.opencv.global.opencv_imgproc.cvFont;


public class AppDemo {
    public static void main(String[] args) {
        //从官网获取的key
        String appId = "给你分配的ID";
        String sdkKey = "你申请的key";
        String sdkLibPath = "D:\\javaworks\\faceDemo\\libs\\WIN64";

        //指定引擎依赖库
        FaceEngine faceEngine = new FaceEngine(sdkLibPath);
        //激活引擎
        int errorCode = faceEngine.activeOnline(appId, sdkKey);
        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            System.out.println("引擎激活失败");
            System.exit(2);
        }
        //获取激活文件
        ActiveFileInfo activeFileInfo=new ActiveFileInfo();
        errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            System.out.println("获取激活文件信息失败");
            System.exit(2);
        }
        //引擎配置
        EngineConfiguration engineConfiguration = new EngineConfiguration();
//        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_VIDEO);
        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);
//        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
        engineConfiguration.setDetectFaceMaxNum(10);
        engineConfiguration.setDetectFaceScaleVal(16); //视频推荐16 图片推荐32
        //功能配置
        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("初始化引擎失败");
            System.exit(2);
        }

        //本地摄像头视频进行人脸识别
        OpenCVFrameGrabber grabber = null; //帧抓取器
        try{
            //抓取摄像头
            grabber = new OpenCVFrameGrabber(0);
            // grabber.setFrameRate(24);
            grabber.setImageWidth(960);
            grabber.setImageHeight(540);
            grabber.start();

            //新建窗口
            CanvasFrame canvasFrame = new CanvasFrame("摄像头");
            canvasFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            canvasFrame.setAlwaysOnTop(true);

            //转换
            OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage();

            Frame frame = null;

            while (true) {
                if (!canvasFrame.isDisplayable()) {
                    grabber.stop();
                    System.out.println("退出");
                    System.exit(2);
                }

//                 frame = grabber.grabImage();
                frame = grabber.grab();

                IplImage iplImage = converter.convert(frame);
                byte[] imageData = new byte[iplImage.imageSize()];
                iplImage.imageData().get(imageData);

                //提取人脸信息
                List<FaceInfo> imageInfoList = new LinkedList<>();
                errorCode = faceEngine.detectFaces(imageData, iplImage.width(), iplImage.height(), ImageFormat.CP_PAF_BGR24, imageInfoList);
                int faceNum = imageInfoList.size();
                if(faceNum > 0){
                    System.out.println("提取到"+faceNum+"个人脸");

                    //人脸属性检测
                    FunctionConfiguration configuration = new FunctionConfiguration();
                    configuration.setSupportAge(true);
                    configuration.setSupportGender(true);
                    errorCode = faceEngine.process(imageData, iplImage.width(), iplImage.height(), ImageFormat.CP_PAF_BGR24, imageInfoList, configuration);

                    //性别检测
                    List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();
                    errorCode = faceEngine.getGender(genderInfoList);
                    //年龄检测
                    List<AgeInfo> ageInfoList = new ArrayList<AgeInfo>();
                    errorCode = faceEngine.getAge(ageInfoList);

                    //人脸画框
                    for(int i = 0; i<imageInfoList.size(); i++){
                        int x = imageInfoList.get(i).getRect().getLeft();
                        int y = imageInfoList.get(i).getRect().getTop();
                        int xMax = imageInfoList.get(i).getRect().getRight();
                        int yMax = imageInfoList.get(i).getRect().getBottom();
                        int gender = genderInfoList.size()>0 ? genderInfoList.get(i).getGender() : -1;
                        int age = ageInfoList.size()>0 ? ageInfoList.get(i).getAge() : -1;
                        String info = gender + ":" + age;
                        CvScalar cvScalar = cvScalar(0,0,255,0);
                        CvPoint cvPoint =  cvPoint(x,y);
                        CvPoint cvPoint1 = cvPoint(xMax,yMax);
                        opencv_imgproc.cvRectangle(iplImage, cvPoint, cvPoint1,cvScalar,1,4,0);
                        //中文显示乱码不知道怎么办 有知道的请指教谢谢
                        opencv_imgproc.cvPutText(iplImage,info,cvPoint(xMax,y+10),cvFont(1.0),cvScalar);
                    }

                }else{
                    System.out.print("未检测到人脸 ");
                }

                //图片刷新到窗口
                frame = converter.convert(iplImage);
                canvasFrame.showImage(frame);

            }

        }catch (Exception e){
            System.out.println(e.getMessage());
        }finally {
            if(null != grabber){
                try {
                    grabber.close();
                } catch (FrameGrabber.Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }

}

运行下比之前用的 haarcascade_frontalface_alt2.xml 识别度高很多。
在这里插入图片描述

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
虹软SDK是一种人脸识别技术,它广泛应用于各种领域,包括安防监控、社交娱乐、金融支付等。在CSND上,可以找到丰富的关于虹软SDK人脸识别的技术文章和开发案例。 虹软SDK人脸识别技术具有高性能、高准确性和高稳定性的特点。它采用深度学习算法,通过对人脸进行特征分析和匹配,能够实现快速、精准地识别人脸。该技术还可以检测人脸的关键点,如眼睛、鼻子、嘴巴等,用于表情分析和人脸特征提取。 虹软SDK人脸识别还具有优良的适应能力。它能够在复杂的环境条件下进行准确的人脸检测和识别,识别效果不受光线、角度、年龄、肤色等因素的限制。同时,虹软SDK支持多人同时识别,可以实现快速的批量人脸识别。 在CSND上,有许多文章介绍了如何使用虹软SDK实现人脸识别功能。这些文章详细介绍了虹软SDK的安装使用步骤、API接口的调用方法及其返回结果的解析。同时,还提供了许多开发案例和技术分享,包括人脸识别的图像处理方法、模型训练技巧和优化策略等。 在虹软SDK人脸识别的开发过程中,CSND是一个宝贵的资源平台。开发者可以通过学习和参考这些文章和案例,快速掌握虹软SDK使用方法,并且通过技术交流平台与其他开发者进行问题讨论和资源共享。这将有助于提高人脸识别系统的开发效率和质量,促进技术的快速应用和推广。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值