首页 > 其他分享 >虹软sdk实现人脸识别小demo

虹软sdk实现人脸识别小demo

时间:2024-01-25 11:58:02浏览次数:26  
标签:人脸识别 59 虹软 demo 60 61 67 68 new

虹软官网:https://ai.arcsoft.com.cn
注册后,下载适配的sdk

注意提取下载的sdk中的jar包,代码中需要用到

<dependency>
    <groupId>com.arcsoft.face</groupId>
    <artifactId>arcsoft-sdk-face</artifactId>
    <version>3.0.0.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/declib/arcsoft-sdk-face-3.0.0.0.jar</systemPath>
</dependency>

我这里全都写在了一个test类里,代码如下:

package com.example.hr_demo;
 
import Decoder.BASE64Encoder;
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.toolkit.ImageInfo;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.text.DecimalFormat;
import java.util.*;
import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
 
 
@SpringBootTest
class HrDemoApplicationTests {
 
    @Test
    void contextLoads() throws UnsupportedEncodingException {
 
 
        //在线激活
        String appId = "ididididiididid"; //你下载sdk的时候会给你id和key,填写进来就行
        String sdkKey = "keykeykeykey";
        //System.loadLibrary("");
        FaceEngine faceEngine = new FaceEngine("D:\\HRSDK\\libs\\WIN64");
        int activeCode = faceEngine.activeOnline(appId, sdkKey);
        if (activeCode != ErrorInfo.MOK.getValue() && activeCode !=         
        ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            System.out.println("引擎激活失败");
        }else {
            System.out.println("引擎激活成功");
        }
 
 
 
        int errorCode;
        ActiveFileInfo activeFileInfo=new ActiveFileInfo();
        errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
        if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
            System.out.println("获取激活文件信息失败");
        }
 
        //引擎配置
        EngineConfiguration engineConfiguration = new EngineConfiguration();
        engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
        engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
        engineConfiguration.setDetectFaceMaxNum(10);
        engineConfiguration.setDetectFaceScaleVal(16);
        //功能配置
        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("初始化引擎失败");
        }
 
        //人脸检测 输入端
        ImageInfo imageInfo = getRGBData(new File("C:\\Users\\xxxx\\Desktop\\fbb.png"));//被检测的图片
        //ImageInfo imageInfo = getRGBData(new File("D:\\Idea\\DB_images\\fanbingbing_jksiahd.png"));
        System.out.println("imageInfo =" + imageInfo );
        List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
        errorCode  = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
        System.out.println("识别到的人脸数 = " + faceInfoList.size());//
 
        //特征提取
        FaceFeature faceFeature = new FaceFeature();
        errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
 
        String str = "0,-128,-6,68,0,0,-96,65,93,105,37,-69,-10,10,14,61,115,99,-104,60,-14,20,50,-67,-53,127,-26,61,-74,-56,5,-66,-85,62,-103,-67,75,83,33,-68,-43,75,106,-68,101,76,-79,-69,34,-86,88,61,74,-118,-57,61,72,81,65,-67,-59,23,68,60,-6,-106,24,61,5,121,6,-66,-26,-69,-28,-68,-114,74,18,62,-62,63,-36,61,-85,68,19,59,34,-78,94,61,3,60,-20,-67,-85,34,38,-66,33,106,-60,-67,48,71,-27,-69,66,-20,41,61,121,-47,-30,60,-31,-65,45,-67,-117,26,11,62,-34,107,-113,61,59,92,-104,-68,109,31,-95,-68,-90,-28,-34,60,19,-115,80,61,-63,2,-45,-67,-16,-58,-4,61,-113,-67,33,-70,-79,39,-85,-67,1,71,-79,-67,89,60,12,62,3,-75,33,61,-38,-50,18,61,101,-43,-67,-68,77,-6,18,-67,13,-124,-52,60,-41,-85,-104,-67,7,52,86,60,-58,-85,-27,61,40,34,40,-67,36,-121,10,-68,120,61,-36,61,126,46,55,60,90,-25,7,-67,-11,-125,-62,60,70,19,66,62,110,120,-122,61,50,34,-36,-69,-89,115,-73,-67,-118,29,27,60,41,-92,101,61,-43,73,84,61,-9,75,119,61,-81,55,123,-67,-2,-12,-52,60,-25,40,123,-67,-5,45,19,61,-91,1,-53,60,115,-92,-4,-69,-85,-76,-122,60,89,49,-123,-70,-30,57,-60,-67,87,25,88,-67,95,-61,-84,59,114,70,-102,60,-86,-79,47,59,-70,-62,72,-67,113,127,-48,61,-68,-111,-123,-67,65,39,-111,-67,-9,-102,-38,-68,111,100,-86,61,-14,126,36,-67,75,-4,-10,-69,105,61,113,-68,15,121,20,-67,7,47,-73,61,8,23,-102,-67,83,25,6,62,49,-7,34,61,-90,19,-55,60,-2,31,-40,-68,37,84,-120,61,22,119,53,62,-46,43,-125,61,49,93,33,61,5,11,79,61,60,110,-124,61,-86,-39,-41,-67,37,87,-30,-68,-5,40,-91,-68,-3,-21,-88,59,116,30,-121,59,-128,-98,-113,-67,-75,44,-101,-67,19,26,-109,61,-88,124,-79,61,-55,-2,-42,61,-84,-126,-125,59,30,-49,-59,-67,-67,-46,-45,-68,26,-33,32,60,-9,-88,-102,61,-11,-110,-41,61,-75,-70,115,-70,75,-93,-127,61,33,65,-73,60,98,117,39,-69,-87,106,-61,-67,-12,50,-114,-68,121,-18,52,61,-124,69,14,-67,108,-11,4,-66,11,67,54,-66,-120,5,103,-68,58,-96,83,-67,-48,-30,-118,-67,126,-59,119,61,-111,-125,-109,-67,8,1,-15,60,-82,40,85,61,88,82,56,-70,1,-30,4,62,-16,37,-93,61,117,-13,50,-67,43,88,-116,59,40,-77,-73,-68,35,-34,8,-67,-106,61,-115,-67,120,96,-78,-68,-106,-44,-12,61,-45,126,-5,61,7,118,15,-67,-111,-40,-107,-67,-5,99,68,61,-106,71,-13,60,17,81,-115,60,-58,21,49,59,106,-22,-29,-67,-119,57,-79,-68,-17,-59,34,-67,74,39,-10,-68,58,56,123,61,-73,72,-73,56,86,119,-76,61,89,-91,-15,-67,-65,-24,-107,-69,51,80,14,-67,-48,123,23,60,-65,-12,-69,-68,71,-71,-103,-68,-17,101,-83,60,29,-99,-120,61,38,77,-13,60,71,-5,15,-69,-91,-91,72,-68,-128,-98,66,61,-126,101,30,58,45,-109,-65,61,-95,-113,43,-67,69,105,6,-68,-21,13,-128,61,90,-68,10,-67,-42,-82,71,-67,102,-35,-41,61,24,25,93,-67,118,9,-36,-67,10,-117,-74,-68,101,124,110,-69,46,53,-103,61,6,-10,73,-68,115,81,-6,59,88,100,68,-67,120,78,-57,-67,-113,-101,93,61,8,111,74,60,20,119,16,60,9,-108,-47,61,123,-112,7,62,17,-106,7,61,59,64,-64,60,22,78,12,61,126,-18,-122,61,-78,117,-46,-68,109,89,-63,-67,-103,-90,7,-66,-85,112,60,-67,79,-43,-111,61,61,127,-88,-67,19,56,-60,-68,117,28,9,-67,-120,108,-82,-67,-107,22,36,60,-37,-63,-36,60,43,-84,-19,59,15,-11,-125,-68,-48,-11,-40,-67,-50,123,-75,-67,75,111,-106,-68,70,-12,-40,-68,-64,-68,-12,-68,-5,-54,-47,59,40,-85,57,-67,53,-56,73,-67,-113,113,22,61,1,103,-53,-67,119,-39,72,-67,96,-80,57,-67,10,-22,-113,-68,19,-38,-116,-67,-6,-82,-11,-68,57,-28,-79,-67,-3,121,-4,-68,-17,-109,-89,-67,97,17,-58,61,102,-46,52,62,-83,9,-118,-67,82,-62,95,-67,-50,-22,63,59,81,37,-18,-67,-61,-99,-27,-68,109,105,101,-67,-51,-48,-41,-67,-105,-97,82,61,-103,115,-43,60,-66,-47,-119,-67,15,50,10,-67,-103,-86,-5,61,18,-7,-77,-67,5,43,18,61,-41,-46,125,-67,123,97,3,-67,-14,-86,96,-67,110,-82,97,60,98,76,-71,60,-73,-6,17,60,75,113,29,61,69,-22,-89,61,-105,47,63,-68,34,1,-121,61,-91,-113,-62,-67,93,71,93,-70,42,2,-81,61,-54,33,-65,-70,-103,-42,-82,-67,-26,114,-117,60,14,8,-90,-69";
 
        byte[] s = new byte[1032];
               s= str.getBytes("UTF-8");
 
        System.out.println(Arrays.equals(faceFeature.getFeatureData(), s));
        System.out.println(faceFeature.getFeatureData().length    +   "===="   +s.length);
        System.out.println(new String(s, StandardCharsets.UTF_8));
 
 
 
 
 
        //检索数据库已存在人脸信息比对
        String dbImgPath = "D:\\Idea\\DB_images\\";//我这里是用了本地文件夹中的图片代替数据库(实际运用中肯定是保存特征码到数据库中来和被检测的对象进行比对)
        List<String> imageNames = getImageFileNames(dbImgPath);
        int getFlag = 0;
        for (String imageName : imageNames) {
            ImageInfo imageInfo2 = getRGBData(new File(dbImgPath + imageName));//数据库文件xxxxx
            List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();
            errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),imageInfo2.getImageFormat(), faceInfoList2);
            FaceFeature faceFeature2 = new FaceFeature();
            errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), imageInfo2.getImageFormat(), faceInfoList2.get(0), faceFeature2);
            //特征比对
            FaceFeature targetFaceFeature = new FaceFeature();
            targetFaceFeature.setFeatureData(faceFeature.getFeatureData());
            FaceFeature sourceFaceFeature = new FaceFeature();
            sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData());
            FaceSimilar faceSimilar = new FaceSimilar();
            errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
 
 
            //
            //String s = new String(targetFaceFeature.getFeatureData());  //"GBK" "UTF-8"
            //System.out.println("-==-  " + s);
 
            if (faceSimilar.getScore() > 0.7){
                //转换为百分比
                DecimalFormat df = new DecimalFormat("0.00%");
                System.out.println("你好你是" + imageName.substring(0, imageName.indexOf("_")) +
                        "吧。相似度:" + df.format(faceSimilar.getScore()));
                getFlag = 1;
                break;
            }
 
        }
        if (getFlag == 0) System.out.println("人员未识别到");
 
 
        //设置活体测试
        errorCode = faceEngine.setLivenessParam(0.5f, 0.7f);
        //人脸属性检测
        FunctionConfiguration configuration = new FunctionConfiguration();
        configuration.setSupportAge(true);
        configuration.setSupportFace3dAngle(true);
        configuration.setSupportGender(true);
        configuration.setSupportLiveness(true);
        errorCode = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, configuration);
 
        //性别检测
        List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();
        errorCode = faceEngine.getGender(genderInfoList);
        if (genderInfoList.get(0).getGender() == 0)System.out.println("性别男");
        if (genderInfoList.get(0).getGender() == 1)System.out.println("性别女");
 
        //引擎卸载
        errorCode = faceEngine.unInit();
 
    }
 
    //遍历文件夹图片名称
    public static List<String> getImageFileNames(String dbImgPath) {
        List<String> imageNames = new ArrayList<>();
        File folder = new File(dbImgPath);
        File[] files = folder.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isFile()) {
                    String fileName = file.getName();
                    if (isImageFile(fileName)) {
                        imageNames.add(fileName);
                    }
                }
            }
        }
 
        return imageNames;
    }
 
    //文件名称筛选
    public static boolean isImageFile(String fileName) {
        String extension = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();//转为小写
        return extension.equals("jpg") || extension.equals("jpeg") || extension.equals("png");
    }
 
 
    //这里是一般前端会取图片或者视频取一帧给你
    @Test
    public void GetImageStr() {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
        String imgFile = "C:\\Users\\xxx\\Desktop\\lll.png";// 待处理的图片
        InputStream in = null;
        byte[] data = null;
        String encode = null; // 返回Base64编码过的字节数组字符串
        // 对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        try {
            // 读取图片字节数组
            in = new FileInputStream(imgFile);
            data = new byte[in.available()];
            in.read(data);
            encode = encoder.encode(data);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println(encode);
    }
 
 
}
 

其大概用法就是这样,要结合实际业务去调整。 

标签:人脸识别,59,虹软,demo,60,61,67,68,new
From: https://www.cnblogs.com/iRyz/p/17986846

相关文章

  • 不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认
    今天运行项目的时候出现了这个错误....查了一下解决的方法。具体方案如下: 1、先确认安装IIS的时候有没有装Asp.Net,如果没安装的话,安装上即可。(XTHS:采用这步,就可以了!) 2、IIS采用了更安全的web.config管理机制,默认情况下会锁住配置项不允许更改。用超级管理员的身份执......
  • rocketmq--同步、异步、批量、事务消息demo
    在SpringBoot中使用RocketMQ进行同步和异步消息传输的关键是使用RocketMQTemplate类。下面是两个例子,分别演示了如何实现同步和异步消息传输。首先,确保你已经添加了RocketMQ的依赖到你的pom.xml中,如下所示:<dependency><groupId>org.apache.rocketmq</groupId><artifa......
  • rocketmq--消息顺序消费demo
    在RocketMQ中,要实现消息的顺序消费,你需要确保以下几点:发送消息时,相同业务顺序的消息应该发送到同一个队列(MessageQueue)。消费者在消费时,应该使用顺序消费的方式。下面是一个使用SpringBoot和RocketMQ实现消息顺序消费的例子。添加依赖(pom.xml):<dependencies><de......
  • rocketmq--两种消息模型的区别及demo
    RocketMQ主要支持两种消息模型:集群消费(Clustering)和广播消费(Broadcasting)。集群消费(Clustering):在集群消费模式下,同一个消费者组(ConsumerGroup)中的消费者实例平均分摊消费消息,即一个消息只会被消费者组中的一个消费者消费一次。这种模式适用于负载均衡场景,可以提高消费的并......
  • 如何在OriginBot上实现人脸识别
    转载自古月居编辑:东岸因为@一点人工一点智能01  人脸识别大家在生活中经常会看到在我们进入商城时,门口会有相机在拍摄我们,并且会统计有多少人数进入商店,它是如何进行人数量统计的呢?这就是是计算机视觉领域的一项关键技术——人脸识别,它使计算机系统能够自动检测、识别和验证图像......
  • Flink Java Demo
    1.新建Maven项目<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://......
  • 自定义echarts绘制直方图,XY轴互调Demo
    1constcolorList=[2'#4f81bd',3'#c0504d',4'#9bbb59',5'#604a7b',6'#948a54',7'#e46c0b'8];9constdata=[10[10,16,3,'A'],11[16,18,15,&#......
  • 人脸识别系统【从0到1完成一个小项目】【6】【springboot快速上手】
    1.父类在pom.xml里面添加如上代码,有些会自动生成,没有生成的添加一下<parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.7.6</version></parent>......
  • Java使用modbus4j通过串口modbus-rtu协议 连接设备 demo
    前言项目中需要使用串口来连接操控烟雾报警器且只能使用modbus-rtu协议在找了一堆资料后终于成功了在此呈上代码和资料链接【ModBus】modbus之modbus4j的使用和流程原理解析(5)-CSDN博客使用modbus4j通过串口解析modbus协议(java)_javamodbus4j-CSDN博客 串口通讯需要使用modbus4j......
  • OPEN SQL取单条数据DEMO
      *&---------------------------------------------------------------------**&FormFRM_GET_INFO_EDH*&---------------------------------------------------------------------**text*-----------------------------------------------......