当前位置: 首页 > news >正文

Springboot实现人脸识别与WebSocket长连接的实现

0.什么是WebSocket,由于普通的请求是间断式发送的,如果要同一时间发生大量的请求,必然导致响应速度慢(因为根据tcp协议要经过三层握手,如果不持续发送,就会导致n多次握手,关闭连接,打开连接)

1.业务需求: 由于我需要使用java来处理视频的问题,视频其实就是图片,相当于每张图片就是帧,不停发送帧去实现人脸失败,然后返回处理结果,(支付宝刷脸支付也是同样的道理)

2.前端建立WebSocket()对象,onMessage函数监听返回的结果

<!DOCTYPE html>
<html>
<head><title>视频帧捕获</title>
</head>
<body><video id="videoElement" autoplay></video><canvas id="canvasElement" style="display: none;"></canvas><script>//如果是https协议的话,就需要改为 wssvar socket = new WebSocket("ws://localhost:8080/facedetect");const video = document.getElementById('videoElement');const canvas = document.getElementById('canvasElement');const context = canvas.getContext('2d');socket.onopen = function() {console.log("xxxx");// 每1秒发送一次视频帧数据,必须要在这里写定时器,因为打开连接后才能发送请求,不然每次都会报Websocket close的错误setInterval(captureFrame,10000)};socket.onmessage = function(event) {var result = event.data;// 处理服务器返回的结果console.log(result);//打印出结果};socket.onclose = function(event) {console.log("WebSocket已关闭");};socket.onerror = function(event) {console.error('WebSocket错误:', event);};navigator.mediaDevices.getUserMedia({ video: true }).then(stream => {video.srcObject = stream;}).catch(error => {console.error('无法访问摄像头:', error);});function captureFrame() {context.drawImage(video, 0, 0, canvas.width, canvas.height);const imageDataUrl = canvas.toDataURL('image/jpeg', 0.5);console.log(imageDataUrl) socket.send(imageDataUrl);// 将数据URL发送到WebSocket服务器}// 每隔一段时间捕获一帧并发送到Servlet</script>
</body>
</html>

3.后端写配置类,配置websocket的路径

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {//录入人脸数据页面registry.addHandler(myHandler(),  "/face").setAllowedOrigins("*");//人脸识别页面registry.addHandler(myHandler1(), "/facedetect").setAllowedOrigins("*");}@Beanpublic WebSocketHandler myHandler() {return new FaceController();}@Beanpublic WebSocketHandler myHandler1() {return new FaceController1();}
}

4.写controller

//人脸录入的controller
@Controller
@RequestMapping("/face")
@CrossOrigin
public class FaceController extends TextWebSocketHandler {private WebSocketSession session;// 处理WebSocket连接请求@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {System.out.println("WebSocket连接已建立");// 保存WebSocket会话this.session = session;}// 处理WebSocket文本消息@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {String text = message.getPayload();System.out.println(text);text = text.replaceFirst("^data:image/[^;]+;base64,?\\s*", "");text = text.replaceAll("[^A-Za-z0-9+/=]", "");System.out.println(text);byte[] imageBytes = Base64.getDecoder().decode(text);if (imageBytes != null) {try {// 读取字节数组并返回BufferedImage对象ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);BufferedImage bufferedImage = ImageIO.read(bis);if (bufferedImage != null) {// 示例:显示图像宽度和高度int width = bufferedImage.getWidth();int height = bufferedImage.getHeight();System.out.println("图像宽度:" + width);System.out.println("图像高度:" + height);//录入人脸Employee e1 = HRService.addEmp(UUID.randomUUID().toString().substring(0,10), bufferedImage);ImageService.saveFaceImage(bufferedImage, e1.getCode());// 保存员工照片文件System.out.println(e1.getCode());// 在这里可以对BufferedImage对象进行其他操作} else {System.out.println("无法读取图像");}} catch (Exception e) {e.printStackTrace();}} else {System.out.println("无效的base64数据");}}// 根据接收到的文本消息进行相应的处理}
//人脸检测的控制器
@Controller
@RequestMapping("/facedetect")
@CrossOrigin
public class FaceController1 extends TextWebSocketHandler {
private WebSocketSession session;// 处理WebSocket连接请求@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {System.out.println("WebSocket连接已建立");// 保存WebSocket会话this.session = session;}// 处理WebSocket文本消息@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {System.out.println("detect");String text = message.getPayload();System.out.println(text);text = text.replaceFirst("^data:image/[^;]+;base64,?\\s*", "");text = text.replaceAll("[^A-Za-z0-9+/=]", "");System.out.println(text);byte[] imageBytes = Base64.getDecoder().decode(text);if (imageBytes != null) {try {// 读取字节数组并返回BufferedImage对象ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);BufferedImage bufferedImage = ImageIO.read(bis);if (bufferedImage != null) {FaceEngineService.loadAllFaceFeature();FaceFeature faceFeature = FaceEngineService.getFaceFeature(bufferedImage);// 获取当前帧中出现的人脸对应的特征码String code = FaceEngineService.detectFace(faceFeature);System.out.println(code);if (code != null) {// 如果特征码不为null,表明画面中存在某员工的人脸Employee e = HRService.getEmp(code);// 根据特征码获取员工对象HRService.addClockInRecord(e);// 为此员工添加打卡记录// 文本域添加提示信息session.sendMessage(new TextMessage("打卡成功"));}// 在这里可以对BufferedImage对象进行其他操作} else {session.sendMessage(new TextMessage("打卡成功"));}} catch (Exception e) {e.printStackTrace();}} else {System.out.println("无效的base64数据");}}// 根据接收到的文本消息进行相应的处理}

相关文章:

Springboot实现人脸识别与WebSocket长连接的实现

0.什么是WebSocket,由于普通的请求是间断式发送的,如果要同一时间发生大量的请求,必然导致响应速度慢(因为根据tcp协议要经过三层握手,如果不持续发送,就会导致n多次握手,关闭连接,打开连接) 1.业务需求: 由于我需要使用java来处理视频的问题,视频其实就是图片,相当于每张图片…...

智能安全帽功能-EIS智能防抖摄像头4G定位视频语音气体检测

智能安全帽是一种集成多种智能功能的产品&#xff0c;例如实时定位、语音对讲、健康监测和AI智能预警等。这些丰富的功能能够更好地帮助工人开展工作&#xff0c;并提升安全保障水平。智能安全帽在各个行业中的应用越来越广泛。尤其在工程建设领域&#xff0c;项目管理和工作安…...

TEMU跨境平台珠宝首饰RSL报告如何办理?

首饰或者产品TEMU拼多多跨境平台要求的RSL报告如何办理&#xff1f; 珠宝首饰上架前必须进行RSL Report&#xff08;欧盟禁限用化学物质检测报告&#xff09; 随着人们对珠宝首饰的要求越来越高&#xff0c;为了确保珠宝首饰的安全性&#xff0c;欧盟REACH法规规定&#xff0c…...

51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+原理图+PCB+设计报告+讲解视频)

51单片机的篮球计分器液晶LCD1602显示 &#x1f4d1;1.主要功能&#xff1a;&#x1f4d1;讲解视频&#xff1a;&#x1f4d1;2.仿真&#x1f4d1;3. 程序代码&#x1f4d1;4. 原理图&#x1f4d1;5. PCB图&#x1f4d1;6. 设计报告&#x1f4d1;7. 设计资料内容清单&&…...

【NI-DAQmx入门】NI-DAQmx之Python

NI-DAQmx Python GitHub资源&#xff1a; NI-DAQmx Python 文档说明&#xff1a;NI-DAQmx Python Documentation — NI-DAQmx Python API 0.9 documentation nidaqmx支持 CPython 3.7和 PyPy3&#xff0c;需要注意的是多支持USB DAQ和PCI DAQ&#xff0c;cDAQ需要指定…...

YoloV8目标检测与实例分割——目标检测onnx模型推理

一、模型转换 1.onnxruntime ONNX Runtime&#xff08;ONNX Runtime或ORT&#xff09;是一个开源的高性能推理引擎&#xff0c;用于部署和运行机器学习模型。它的设计目标是优化执行使用Open Neural Network Exchange&#xff08;ONNX&#xff09;格式定义的模型&#xff0c;…...

pcigo图床插件的简单开发

1.前言&#xff1a; 如果想写一个图床并且投入使用&#xff0c;那么&#xff0c;接入picgo一定是一个不错的选择。picgo有着windows&#xff0c;mac&#xff0c;linux等多个客户端版本。实用且方便。 2. 开发的准备&#xff1a; 2.0. 需要安装一个node node这里我就不详细说…...

Find My手机保护壳|苹果Find My与手机保护壳结合,智能防丢,全球定位

随着科技水平的快速发展&#xff0c;科技美容这一行业做为新型产业新生而出。时尚IT品牌随着市场的多元化发展。针对手机品牌和功能的增加而呈多样化&#xff0c;将手机保护壳按质地分有PC壳&#xff0c;皮革 &#xff0c;硅胶&#xff0c;布料&#xff0c;硬塑&#xff0c;皮套…...

encode和decode的区别

字节序列和字符串是Python中两种不同的数据类型&#xff0c;它们的主要区别在于表示和处理方式&#xff01; 字节序列&#xff08;Bytes&#xff09;&#xff1a; 字节序列是一种二进制数据类型&#xff0c;它由一系列字节组成。字节是计算机存储信息的基本单位&#xff0c;每…...

建设项目管理中的 5 大预算挑战

为建设项目管理制定可靠、准确的预算是一项艰巨的任务&#xff0c;对于中小型建筑企业来说尤其如此。预算必须精确&#xff0c;同时还要考虑到每项工作的独特性和复杂性。 一项建筑行业相关调查统计了参与施工预算流程的人员所面临的最大挑战&#xff0c;分别是时间、预算、不…...

vue2 集成 - 超图-SuperMap iClient3D for WebGL

1:下载SuperMap iClient3D for WebGL SuperMap iClient3D for WebGL产品包 打开资源目录如下 2:格式化项目中所用的依赖包 开发指南 从超图官网下载SuperMap iClient3D 11i (2023) SP1 for WebGL_CN.zip解压后,将Build目录下的SuperMap3D复制到项目中 \public\static…...

FPGA设计过程中有关数据之间的并串转化

1.原理 并串转化是指的是完成串行传输和并行传输两种传输方式之间的转换的技术&#xff0c;通过移位寄存器可以实现串并转换。 串转并&#xff0c;将数据移位保存在寄存器中&#xff0c;再将寄存器的数值同时输出&#xff1b; 并转串&#xff0c;将数据先进行移位&#xff0…...

hologres基础知识一文全

1 功能特性 1.1多场景查询分析 Hologres支持行存、列存、行列共存等多种存储模式和索引类型,同时满足简单查询、复杂查询、即席查询等多样化的分析查询需求。Hologres使用大规模并行处理架构,分布式处理SQL,提高资源利用率,实现海量数据极速分析。 亚秒级交互式分析 Holo…...

阿里云oss迁移到AWS S3

这里写自定义目录标题 0.项目背景1.rclone 方式2.rsync方式3.注意 0.项目背景 公司迁移要求&#xff1a;从阿里云oss到亚马逊s3&#xff0c;数据量大概500G-2T左右。 开启阿里云oss 加速模式&#xff0c;这样能够跨机房和区域加速。 主要采用以下两种方式同步数据&#xff0c;…...

RabbitMQ(高级特性):限流

消费端限流 在rabbitmq中&#xff0c;使用消费端限流必须开启手动签收信息 过MQ可以对请求进行“削峰填谷”&#xff0c;即通过消费端限流的方式限制消息的拉取速度&#xff0c;达到保护消费端的目的。 生产者批量发送消息&#xff1a; Test public void testSendBatch() {…...

LeetCode--570. 至少有5名直接下属的经理

文章目录 1 题目描述2 测试用例3 解题思路3.1 解法 1 1 题目描述 表: Employee ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | | department | varchar | | managerId | in…...

Ubuntu20.04下安装Redis环境

apt安装Redis环境 更新apt-get安装镜像源 安装Redis sudo apt-get install -y redis-server设置密码 # 编辑Redis的配置文件redis.conf&#xff0c;如果不知道配置文件的位置可以执行whereis redis.conf查看 sudo vim /etc/redis/redis.conf取消文件中的requirepass注释&am…...

什么是用户体验测试? 为什么很重要?

在当今数字化时代&#xff0c;用户体验(User Experience&#xff0c;简称UX)已经成为产品成功的关键因素之一。无论是应用程序、网站、硬件设备还是软件&#xff0c;提供出色的用户体验不仅能够吸引更多用户&#xff0c;还能够增加用户满意度&#xff0c;提高品牌忠诚度&#x…...

Android 图片翻面动画

一、需求描述 项目需要实现塔罗牌的翻面效果&#xff0c;需要点击图片后&#xff0c;图片实现翻面&#xff0c;并且翻面过程中&#xff0c;替换成图片资源&#xff0c;类似于扑克牌翻面。 二、实现思路 图片实现翻面效果&#xff0c;并且在动画执行到一半&#xff08;刚好到图…...

如何恢复已删除的PDF文件?4个常用方法分享(含操作步骤)!

“不小心删除了一些比较重要的PDF文件&#xff0c;大家能不能帮帮忙呀&#xff1f;有没有方法可以恢复已经删除的PDF文件呢&#xff1f;” PDF文件在我们的日常工作和生活中扮演着重要的角色&#xff0c;我们可能经常都需要使用到它。但不可避免的是&#xff0c;我们在使用电脑…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...