SpringBoot整合百度云人脸识别功能

news2024/11/27 22:36:33

SpringBoot整合百度云人脸识别功能

1.在百度官网创建应用

首先需要在百度智能云官网中创建应用,获取AppID,API Key,Secret Key

官网地址:https://console.bce.baidu.com/

image-20230527212420738

2.添加百度依赖

添加以下依赖即可。其中版本号可在maven官网查询

<dependency>
    <groupId>com.baidu.aip</groupId>
    <artifactId>java-sdk</artifactId>
    <version>${version}</version>
</dependency>

3.在application.yml中添加属性

便于后面去获取值

image-20230527212843730

4.创建AipFace

AipFace是人脸识别的Java客户端,为使用人脸识别的开发人员提供了一系列的交互方法。初始化完成后建议单例使用,避免重复获取access_token(官方原话)

@Configuration
public class BaiduConfig {

    @Value("${baidu.appId}")
    private String appId;

    @Value("${baidu.key}")
    private String key;

    @Value("${baidu.secret}")
    private String secret;

    @Bean
    public AipFace aipFace(){
        return new AipFace(appId,key,secret);
    }
}

5.注册人脸接口

客户端上传的人脸的图片的Base64编码,并将该用户人脸图形进行本地保存,且存入数据库

@Value("${PhotoPath}")
private String filePath;

@Autowired
private AipFace aipFace;

@RequestMapping(value = "register",method = RequestMethod.POST)
public String register(String userName,String faceBase) throws IOException {
    if(!StringUtils.isEmpty(userName) && !StringUtils.isEmpty(faceBase)) {
        // 文件上传的地址
        System.out.println(filePath);
        // 图片名称
        String fileName = userName + System.currentTimeMillis() + ".png";
        System.out.println(filePath + "\\" + fileName);
        File file = new File(filePath + "\\" + fileName);

        // 往数据库里插入一条用户数据
        Users user = new Users();
        user.setUserName(userName);
        user.setUserPhoto(filePath + "\\" + fileName);
 	//判断用户名是否重复
         LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(User::getUserName, userName);
         User exitUser = userService.getOne(queryWrapper);
          if (exitUser != null) {
              return "2";
         }
	userService.save(user);

        // 保存上传摄像头捕获的图片
        saveLocalImage(faceBase, file);
        // 向百度云人脸库插入一张人脸
        faceSetAddUser(aipFace,faceBase,user.getUserId());
    }
    return "1";
}


public boolean saveLocalImage(String imgStr, File file) {
    // 图像数据为空
    if (imgStr == null) {
        return false;
    }else {
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            // Base64解码
            byte[] bytes = decoder.decodeBuffer(imgStr);
            for (int i = 0; i < bytes.length; ++i) {
                if (bytes[i] < 0) {
                    bytes[i] += 256;
                }
            }
            // 生成jpeg图片
            if(!file.exists()) {
                file.getParentFile().mkdir();
                OutputStream out = new FileOutputStream(file);
                out.write(bytes);
                out.flush();
                out.close();
                return true;
            }

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    } 
    return false;	
}

public boolean faceSetAddUser(AipFace client, String faceBase, String userId) {
    // 参数为数据库中注册的人脸
    HashMap<String, String> options = new HashMap<String, String>();
    options.put("user_info", "user's info");
    JSONObject res = client.addUser(faceBase, "BASE64", "user_01", userId, options);
    return true;
}

6.人脸登录接口

@RequestMapping(value = "login",method = RequestMethod.POST)
public String login(String faceBase) {
    String faceData = faceBase;
    // 进行人像数据对比
    Double num = verifyUser(faceData,aipFace);
    if( num > 80) {
        return "1";
    }else {
        return "2";
    }
}

public Double verifyUser(String imgBash64,AipFace client) {
    // 传入可选参数调用接口
    HashMap<String, String> options = new HashMap<String, String>();
    JSONObject res = client.search(imgBash64, "BASE64", "user_01", options);
    JSONObject user = (JSONObject) res.getJSONObject("result").getJSONArray("user_list").get(0);
    Double score = (Double) user.get("score");
    return score;
}

7.注册登录页面(参考)

其实比较困难的是这个PC端采集用户人脸图像,需要调用PC摄像头。

<style type="text/css">
	*{margin: 0;padding: 0;}
	html,body{width: 100%;height: 100%;}/**/
	h1{color: #fff;text-align: center;line-height: 80px;}
	.media{width: 450px;height: 300px;line-height: 300px;margin: 40px auto;}
	.btn{width: 250px;height:50px; line-height:50px; margin: 20px auto; text-align: center;}
	#register{width: 200px;height:50px;background-color: skyblue;text-align: center;line-height: 50px;color: #fff;}
	#canvas{display: none;}
	#shuru{width: 250px;height:50px; line-height:50px;background-color: skyblue; margin: 20px auto; text-align: center;}
</style>
</head>
<body>
	<h1>百度云人脸注册</h1>
	<div id="shuru">用户名:<input type="text" name="username" id="username"/></div>
	
	<div class="media">
		<video id="video" width="450" height="300" src="" autoplay></video>
		<canvas id="canvas" width="450" height="300"></canvas>
	</div>
	<div class="btn"><button id="register" >确定注册</button></div>
	<script type="text/javascript" src="js/jquery-3.3.1.js"></script>

	<script type="text/javascript">
	/**调用摄像头,获取媒体视频流**/
	var video = document.getElementById('video');
	//返回画布二维画图环境
	var userContext = canvas.getContext("2d");
	var getUserMedia = 
		//浏览器兼容,表示在火狐、Google、IE等浏览器都可正常支持
		(navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia)
		//getUserMedia.call(要调用的对象,约束条件,调用成功的函数,调用失败的函数)
		getUserMedia.call(navigator,{video: true,audio: false},function(localMediaStream){
			//获取摄像头捕捉的视频流
			video.srcObject=localMediaStream;
		},function(e){
			console.log("获取摄像头失败!!")
		});
	//点击按钮注册事件
	 var btn = document.getElementById("register");
	
	btn.onclick = function () {
		var username = $("#username").val();
		alert($("#username").val());
			if(username != null){
				//点击按钮时拿到登陆者面部信息
		           userContext.drawImage(video,0,0,450,300);
		           var userImgSrc = document.getElementById("canvas").toDataURL("img/png");
		           //拿到bash64格式的照片信息
		           var faceBase = userImgSrc.split(",")[1];
		           
		           //ajax异步请求
		           $.ajax({
		        	   url: "register",
		        	   type: "post",
		        	   data: {"faceBase": faceBase,
		        		   "userName": username
		        	   },
		        	   success: function(result){
		        		   if(result === '1'){
		        			   alert("注册成功!!,点击确认跳转至登录页面");
			        		   window.location.href="toLogin";
		        		   }else if(result === '2'){
		        			   alert("您已经注册过啦!!");
		        		   }else{
		        			   alert("系统错误!!");
		        		   }
		        	   }
		           })
			}else{
				alert("用户名不能为空");
			}
       }
	</script>
</body>

8.测试结果

测试成功后,百度平台上能看到用户组下的人脸数增加了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/577158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【问卷分析】调节效应检验的操作①

文章目录 1.首先要明白自己的调节和自变量是什么类别的2.实操演练2.1 当调节变量是连续变量时2.1.1 将ml中心化2.1.2 使用分层回归探讨自变量和ml的交互对adh的影响2.1.3 结果解读 1.首先要明白自己的调节和自变量是什么类别的 2.实操演练 在本次演练中&#xff0c;我们以自变…

马斯克要用人工智能对抗人工智能

导读&#xff1a;马斯克对人工智能可能变得失控并“摧毁人类”的担忧促使他采取行动&#xff0c;发起了一个名为“TruthGPT”的项目。 本文字数&#xff1a;1400&#xff0c;阅读时长大约&#xff1a;9分钟 亿万富翁埃隆马斯克在谈到人工智能&#xff08;AI&#xff09;的危险时…

瑞合信LED字幕WiFi卡使用教程(8.0版)

请按照提示下载和安装软件&#xff0c;同时请允许所有权限&#xff0c;如下图&#xff1b; 也可以在各大主流应用商店&#xff08;华为、小米、OPPO、vivo、App Store等&#xff09;搜索“瑞合信”直接安装。 首次使用APP时会提示注册登录软件&#xff0c;你可以选择“使用微信…

深度学习进阶篇-预训练模型[4]:RoBERTa、SpanBERT、KBERT、ALBERT、ELECTRA算法原理模型结构应用场景区别等详解

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

Full-Scanner是一个多功能扫描工具,支持被动/主动信息收集,漏洞扫描工具联动,可导入POC和EXP

github项目地址&#xff1a;https://github.com/Zhao-sai-sai/Full-Scanner gitee项目地址&#xff1a;https://gitee.com/wZass/Full-Scanner 工具简介 做挖漏洞渗透测试有的时候要去用这个工具那个工具去找感觉麻烦我自己就写了一个简单的整合工具&#xff0c;有互联网大佬不…

Presto之BroadCast Join的实现

一. 前言 在Presto中&#xff0c;Join的类型主要分成Partitioned Join和Broadcast Join&#xff0c;在Presto 之Hash Join的Partition_王飞活的博客-CSDN博客 中已经介绍了Presto的Partitioned Join的实现过程&#xff0c;本文主要介绍Broadcast Join的实现。 二. Presto中Broa…

ChatGPT免费使用的方法有哪些?

目录 一、ChatGpt是什么&#xff1f; 二、ChatGPT国内免费使用的方法&#xff1a; 第一点&#xff1a;电脑端 第二点&#xff1a;手机端 三、结语&#xff1a; 一、ChatGpt是什么&#xff1f; ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…

1. 从JDK源码级别彻底刨析JVM类加载机制

JVM性能调优 1. 类加载的运行全过程1.1 加载1.2 验证1.3 准备1.4 解析 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 课程内容: 1、从java.exe开始讲透Java类加载运行全过程 2、从JDK源码级别剖析JVM核…

【地铁上的面试题】--基础部分--数据结构与算法--数组和链表

零、章节简介 《数据结构与算法》是《地铁上的面试题》专栏的第一章&#xff0c;重点介绍了技术面试中不可或缺的数据结构和算法知识。数据结构是组织和存储数据的方式&#xff0c;而算法是解决问题的步骤和规则。 这一章的内容涵盖了常见的数据结构和算法&#xff0c;包括数组…

DevOps工作级开发者认证——软件发展

. 本文先从软件产业的现状、发展趋势及挑战&#xff0c;说明敏捷和DevOps必将成为业界主流的研发模式。接着介绍和阐述了敏捷和DevOps的关系&#xff0c;相关理念、价值和主要工程方法。最后重点介绍了某著名公司端到端DevOps的实施框架及其主要内容。 本文的目的&#…

javascript基础八:JavaScript原型,原型链 ? 有什么特点?

一、原型 JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff0c;直到找到一个…

15_Linux工程目录与顶层Makefile

目录 Linux 工程目录分析 顶层Makefile详解 make xxx_defconfig过程 Makefile.build脚本分析 make过程 built-in.o文件编译生成过程 make zImage过程 Linux 工程目录分析 将正点原子提供的Linux源码进行解压,解压完成以后的目录如图所示: 图就是正点原子提供的未编译的…

【数据分类】GRNN数据分类 广义回归神经网络数据分类【Matlab代码#30】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 数据分类问题2. 广义回归神经网络&#xff08;GRNN&#xff09;3. 基于GRNN的数据分类步骤4. 部分代码展示5. 仿真结果展示6. 资源获取说明 【可更换其他算法&#xff0c;获取资源请见文章…

八大排序算法-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序(下)

目录 前言冒泡排序&#xff08;Bubble Sort&#xff09;一、概念二、实现思路三、图示过程四、案例分析1、图示过程2、第一趟排序示例 五、代码1、代码示例2、代码解释3、运行结果 六、复杂度 快速排序&#xff08;QuickSort&#xff09;一、概念二、实现思路三、图示过程四、代…

【C++学习第十二讲】C++ 常量

文章目录 一、前言二、整数常量三、浮点常量四、布尔常量五、字符常量六、字符串常量七、定义常量7.1 #define 预处理器7.2 const 关键字 一、前言 常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&a…

202312读书笔记|《赶时间的人》——灰暗的从前会成为照亮未来的光,艰难的生活里,诗歌是那陡峭的另一面

202312读书笔记|《赶时间的人》——灰暗的从前会成为照亮未来的光&#xff0c;艰难的生活里&#xff0c;诗歌是那陡峭的另一面 《赶时间的人》 作者王计兵&#xff0c;一个外卖员的诗&#xff0c;饱含对生活的热情&#xff0c;向上的力量&#xff0c;仿若身在炼狱&#xff0c;心…

【014】C++数组之一维字符数组和二维字符数组

C数组之一维字符数组和二维字符数组 引言一、一维字符数组1.1、一维字符数组的初始化1.2、字符数组的遍历1.3、从键盘获取字符串1.4、使用示例 二、二维字符数组2.1、定义2.2、初始化2.3、访问 总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&…

KVM虚拟化技术学习-基础入门

1.虚拟化技术概述 虚拟化[Virtualization]技术最早出现在 20 世纪 60 年代的 IBM ⼤型机系统&#xff0c;在70年代的 System 370 系列中逐渐流⾏起来&#xff0c;这些机器通过⼀种叫虚拟机监控器[Virtual Machine Monitor&#xff0c;VMM]的程序 在物理硬件之上⽣成许多可以运⾏…

Windows下Pycharm2022如何使用Centos7中的虚拟环境 venv 实现文件实时同步

前期准备 Windows 与 Centos 怎么搞共享文件夹&#xff0c;之前写了一篇&#xff0c;这里直接引用 hyperf 关于配置yasd调试器进行远程调试 swoole sdebug调试 windowlinux 共享文件夹开发汇总_森叶的博客-CSDN博客yasd github下载链接&#xff1a;https://github.com/swoole…

redis优化

一)优雅的key结构: redis中的key虽然可以自定义&#xff0c;但是最好遵循下面的几个最佳实践约定: 1)遵循基本格式:业务名称:数据名字:ID&#xff1b; 2)长度不要超过44字节&#xff0c;key所占的字节数越小&#xff0c;占用空间越小&#xff0c;越短越好&#xff1b; 3)不要包…