java人脸识别功能实现

2023-11-07

1. 首先是用的百度AI人脸识别接口,去百度申请以下参数作为预备

2.直接导入写好的人脸工具类对人脸进行注册

package cn.abtu.config;


import com.baidu.aip.face.AipFace;

import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

/**
 * @author PDX
 * @website https://blog.csdn.net/Gaowumao
 * @Date 2022-05-08 17:05
 * @Description
 */
@Component
public class BaiduAiUtils {


    @Value("${ai.appId}")
    private String APP_ID;
    @Value("${ai.apiKey}")
    private String API_KEY;
    @Value("${ai.secretKey}")
    private String SECRET_KEY;
    @Value("${ai.imageType}")
    private String IMAGE_TYPE;
    @Value("${ai.groupId}")
    private String groupId;


    private AipFace client;

    private HashMap<String, String> map = new HashMap<>();

    private BaiduAiUtils() {
        map.put("quality_control", "NORMAL");//图片质量
        map.put("liveness_control", "NONE");//活体检测
    }

    @PostConstruct
    public void init() {
        client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
    }


    /**
     * 人脸人注册,将用户照片存入脸库中
     *
     * @param userId
     * @param image
     * @return
     */

    public Boolean faceRegister(String userId, String image) {
        //人脸注册
        JSONObject res = client.addUser(image, IMAGE_TYPE, groupId, userId, map);
        Integer errorCode = res.getInt("error_code");
        if (errorCode != 0) {
            throw new BusinessExeption("106", "人脸注册失败");
}else if (errorCode == 223113) {
    throw new BusinessException(223113,"人脸有被遮挡");
} else if (errorCode==223114) {
    throw new BusinessException(223114,"人脸模糊,拍摄时请不要晃动手机");
} else if (errorCode == 223116) {
    throw new BusinessException(223116,"请勿遮挡面部");
}

        }
        return true;
    }


/**
     * 人脸更新,更新人脸库中的用户照片
     * @param userId
     * @param image
     * @return
     */

    public Boolean faceUpdate(String userId,String image){
        //人脸更新
        JSONObject res = client.updateUser(image, IMAGE_TYPE, groupId, userId, map);
        Integer errorCode = res.getInt("error_code");
        System.out.println(res);
        return errorCode == 0 ? true : false;
    }


/**
     * 人脸检测。判断上传的图片中是否具有面部信息
     * @param image
     * @return
     */

    public Boolean faceCheck(String image){
        JSONObject res = client.detect(image, IMAGE_TYPE, map);
        if (res.has("error_code") && res.getInt("error_code") == 0){
            JSONObject resultObject = res.getJSONObject("result");
            Integer faceNum = resultObject.getInt("face_num");
            return faceNum == 1? true : false;
        }else {
            return false;
        }
    }


/**
     * 人脸查找:查找人脸库中最相似的人脸并返回数据
     *          处理:用户的匹配得分(score)大于80分,即可认为是同一个人
     * @param image
     * @return
     */

    public String faceSearch(String image){
        if (image==null|| StringUtils.isEmpty(image)){
            throw new BusinessExeption("107","照片为空");
        }
        JSONObject res = client.search(image, IMAGE_TYPE, groupId, map);
        if (res.has("error_code") && res.getInt("error_code") == 0){
            JSONObject result = res.getJSONObject("result");
            JSONArray userList = result.getJSONArray("user_list");
            if (userList.length() > 0){
                JSONObject user = userList.getJSONObject(0);
                double score = user.getDouble("score");
                if (score > 80){
                    return user.getString("user_id");
                }
            }
        }
        throw new BusinessExeption("106","未检测到人脸");

    }


/**
     * 人脸删除
     * @param userId
     * @return
     */

    public Boolean faceDelete(String userId){
        JSONObject res = client.deleteUser(groupId,userId,map);
        Integer errorCode = res.getInt("error_code");
        return errorCode == 0 ? true : false;
    }


    public Boolean faceGetUser(String userId){
        JSONObject res = client.getUser(userId,groupId, map);
        if (res.has("error_code") && res.getInt("error_code") == 0){
            JSONObject resultObject = res.getJSONObject("result");
            return resultObject.getJSONArray("user_list").length() > 0;
        }
        return false;
    }


}

 3.前端传入图片路径base64工具类把图片转码成base64

package cn.abtu.config;

import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Repository;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Repository
public class Base64Util {

    /**
     * 图片URL转Base64编码
     * @param imgUrl 图片URL
     * @return Base64编码
     */
    public static String imageUrlToBase64(String imgUrl) {
        URL url = null;
        InputStream is = null;
        ByteArrayOutputStream outStream = null;
        HttpURLConnection httpUrl = null;

        try {
            url = new URL(imgUrl);
            httpUrl = (HttpURLConnection) url.openConnection();
            httpUrl.connect();
            httpUrl.getInputStream();

            is = httpUrl.getInputStream();
            outStream = new ByteArrayOutputStream();

            //创建一个Buffer字符串
            byte[] buffer = new byte[1024];
            //每次读取的字符串长度,如果为-1,代表全部读取完毕
            int len = 0;
            //使用输入流从buffer里把数据读取出来
            while( (len = is.read(buffer)) != -1 ){
                //用输出流往buffer写里入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                outStream.write(buffer, 0, len);
            }

            // 对字节数组Base64编码
            return encode(outStream.toByteArray());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(is != null) {
                    is.close();
                }
                if(outStream != null) {
                    outStream.close();
                }
                if(httpUrl != null) {
                    httpUrl.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return null;
    }

    /**
     * 图片转字符串
     * @param image 图片Buffer
     * @return Base64编码
     */
    public static String encode(byte[] image){
        return Base64.encodeBase64String(image);
    }

    /**
     * 字符替换
     * @param str 字符串
     * @return 替换后的字符串
     */
    public static String replaceEnter(String str){
        String reg ="[\n-\r]";
        Pattern p = Pattern.compile(reg);
        Matcher m = p.matcher(str);
        return m.replaceAll("");
    }
}

 4.再插入人员信息时调用工具类 对比信息就可以了,具体需求具体场景自由搭配.

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java人脸识别功能实现 的相关文章

随机推荐

  • 2022亚马逊云科技中国峰会召开 宣布多项举措赋能客户数字化探索与创新

    2022年10月13日 以 自由构建 探索无限 为主题的亚马逊云科技中国峰会于今天在线上召开 在本次为期2天的峰会上 亚马逊云科技发布了云计算技术趋势展望 宣布 连中外 襄百业 携伙伴 促绿色 四大战略举措 进一步利用亚马逊云科技全球优势和
  • [思考进阶]03 每一个成年人都应该掌握的学习技巧

    除了要提升自己的技术能力 思维的学习和成长也非常非常重要 特推出此 思考进阶 系列 进行刻意练习 从而提升自己的认知 这世间有两种人 一种被誉为天之骄子 拥有那种天才的创造能力 这种人极少 另外一种是平凡的普通人 努力地想成功 这种人很多
  • C语言:输出一组数的最大值与最小值

    C语言 输出一组数中的最大值或最小值 如果要输出多个数的最大值只需更改数组大小与循环的限制条件即可 这里以三个数为例 最大值 include
  • [STM32] 关于USART接收中断的BUG和注意事项

    今天在使用USART模块 遇到了一些问题并解决了 于是发贴共享 问题描述 在使用USART做串口通讯时 我只把接收中断打开 并设置抢占优先级为最低一个级别 而接收中断上一个优先级处理事情比较多 可能占用了2ms时间 当我使用9600波特率往
  • 【Jupyter】【Colab】【AutoGluon】测试

    环境 pip install autogluon 测试代码 AutoGluon官网 from autogluon tabular import TabularDataset TabularPredictor train data Tabul
  • 第七章 缺失数据

    文章目录 一 缺失值的统计和删除 1 缺失信息的统计 2 缺失信息的删除 二 缺失值的填充和插值 1 利用fillna进行填充 练一练 END 2 插值函数 NOTE 关于polynomial和spline插值的注意事项 END 三 Nul
  • 用canvas画出可爱的哆啦A梦

    用canvas画出可爱的哆啦A梦 本文就介绍了如何用canvas案例画出哆啦A梦的基础内容 提示 以下是本篇文章正文内容 下面案例可供参考 一 canvas是什么 HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图
  • seata1.3.0 系列学习(二、nacos+seata使用)

    上篇文章讲了如何安装seata 这篇文章主要讲如何使用 分布讲解什么情况回滚 不回滚 一 新建父级maven pom xml文件导入
  • 数据结构-线性表(链表)(c++版)

    目录 1 单链表的基本概念与特点 2 单链表的特点 3 单链表的结构定义及其方法的实现 3 1 单链表结构的定义 3 2 方法的基本实现 3 3 单链表的插入删除操作讲解 3 4 单链表的删除算法 3 5 单链表的顺序访问与尾递归 3 6
  • c++ string 转 char * 出现乱码 内存共用问题

    系统 unbuntu16 04 IDE vscode 一 出现乱码 std string str Hello Word char p1 str c str 出现乱码 char p2 str data 出现乱码 二 出现内存共用 后面的字符串
  • C++的简单FTP客户端实现(二)编程

    基本FTP客户端 QT C 实现的FTP下载客户端 环境说明 FTP服务器 CentOS7 8 vsFTPD 3 0 2 安装设置见博文 CentOS vsftpd设置 客户端 win10 QT 5 15 2 实现的不是一个功能全的FTP客
  • H.264学习笔记3——帧间预测

    帧间预测主要包括运动估计 运动搜索方法 运动估计准则 亚像素插值和运动矢量估计 和运动补偿 对于H 264 是对16x16的亮度块和8x8的色度块进行帧间预测编码 A 树状结构分块 H 264的宏块 对于16x16的亮度宏块 可以分成16x
  • 【独立开发者er Cocos2d-x实战 011】Cocos2dx 3.x命令行生成APK详解

    Cocos2d x 3 6项目打包生成apk安卓应用文件 搭建安卓环境的步骤有点繁琐 但搭建一次之后 以后就会非常快捷 步骤如下 一 下载安卓环境 搭建Android环境需要用到Android SDK NDK Ant和JDK 下载Andro
  • linux中断处理详解

    与中断有关的数据结构 转载自 http edsionte com techblog archives 1539 1 概述 上文中我们通过一个简单的例子分析了一个中断程序的基本结构 可以看到 中断处理程序在处理中断时起到了关键作用 也是一个中
  • 【2023年电赛国一必备】D题报告模板--可直接使用

    任务 图1 任务内容 要求 图2 基本要求内容 图3 发挥部分内容 说明 图4 说明内容 评分标准 图5 评分内容 正文 部分 摘要 本实验旨在设计和制作一种装置 用于对信号发生器输出的信号进行调制方式识别与参数估计 该装置能够识别和显示信
  • SpringCloud基础知识

    一 什么是微服务架构 微服务 一词源于Martin Fowler的名为Microservices 的博文 可以在他的官方博客上找到 简单地说 微服务是系统架构上的一种设计风格 它的主旨是将一个原本独立的系统拆分成多个小型服务 这些小型服务都
  • telnet远程登陆程序

  • 集合引用类型篇(一)

    ECMAScript中最常用的集合引用类型就是Object和Array 尤其是Array提供的很多方法 可以更方便的操纵数据 为我们提供快速处理数据的能力 Object 显示创建Object的实例对象有两种方法 一种是new Object
  • java开发——Cloneable接口、clone()方法和深浅拷贝

    1 实现Cloneable接口表明该类的对象是允许克隆的 2 允许克隆的意思是 可以调用clone 方法 3 深拷贝还是浅拷贝 取决于如何重写Object的clone 方法 4 原对象和克隆对象的关系 深拷贝 阳关道和独木桥 浅拷贝 藕断丝
  • java人脸识别功能实现

    1 首先是用的百度AI人脸识别接口 去百度申请以下参数作为预备 2 直接导入写好的人脸工具类对人脸进行注册 package cn abtu config import com baidu aip face AipFace import or