上位机知识篇---Flask框架实现Web服务
本文将简单介绍Web 服务与前端显示部分,它们基于Flask 框架和HTML/CSS/JavaScript实现,主要负责将实时视频流和检测结果通过网页展示,并提供交互式状态监控。以下是详细技术解析:
一、Flask Web 服务架构
1. 核心路由设计
@app.route('/')
def index():"""渲染主页面"""return render_template('index.html')@app.route('/video_feed')
def video_feed():"""提供视频流"""return Response(web_streamer.generate(), mimetype='multipart/x-mixed-replace; boundary=frame')@app.route('/status')
def status():"""返回JSON格式的系统状态"""with web_streamer.lock:return {"fps": web_streamer.fps,"face_count": web_streamer.face_count,"posture_status": web_streamer.posture_status,"posture_data": web_streamer.posture_data,"timestamp": time.time()}
-
/
路由:- 使用
render_template
渲染静态 HTML 页面,作为用户交互入口。 - 自动创建
templates
目录(若不存在),并写入硬编码的 HTML 内容(见代码末尾的模板生成逻辑)。
- 使用
-
/video_feed
路由:- 核心功能:通过
Response
对象生成HTTP 多部分响应(multipart/x-mixed-replace
),格式为连续的 JPEG 图像帧,实现实时视频流传输。 - 数据来源:调用
web_streamer.generate()
方法,该方法循环输出编码后的 JPEG 帧(通过cv2.imencode
生成)。 - 性能优化:通过锁(
web_streamer.lock
)保证多线程环境下帧数据的一致性,避免并发访问冲突。
- 核心功能:通过
-
/status
路由:- 提供 JSON 格式的系统状态数据,包括 FPS、人脸数量、姿势状态、时间统计等。
- 前端通过定时请求(如
setInterval
)拉取数据,实现非阻塞式实时更新。
2. 多线程与服务启动
# 启动处理线程
process_thread = threading.Thread(target=video_processing, daemon=True)
process_thread.start()# 启动Flask服务
app.run(host='0.0.0.0', port=5000, threaded=True, use_reloader=False)
-
线程分工:
video_processing
线程:独立处理摄像头读取、人脸 / 姿势检测、帧更新等计算密集型任务,避免阻塞 Flask 主线程。- Flask 主线程:专注于处理 HTTP 请求,确保 Web 服务的响应速度。
daemon=True
:设置为守护线程,确保程序退出时自动终止,避免资源泄漏。
-
服务配置:
host='0.0.0.0'
:监听所有网络接口,允许远程访问。threaded=True
:启用多线程处理请求,支持并发连接(如多个用户同时访问视频流)。use_reloader=False
:关闭 Flask 的自动重载机制,避免在生产环境中重复启动线程。
二、前端显示技术实现
1. HTML 结构设计
<!-- 关键结构片段 -->
<div class="status-bar"><!-- 状态栏:显示FPS、人脸数量、姿势状态等 -->
</div><div id="video-container"><img src="/video_feed" id="video" alt="实时监控画面">
</div><div class="stats"><!-- 统计卡片:展示姿势时间、触发次数等 -->
</div>
-
视频流显示:
- 使用
<img src="/video_feed">
标签直接加载 Flask 提供的视频流接口,浏览器会自动解析多部分响应并更新图像。 max-width: 100%
和 Flex 布局实现响应式设计,适配不同屏幕尺寸。
- 使用
-
状态监控栏:
- 通过 Flex 布局实现水平排列,包含系统状态、FPS、人脸数量、姿势状态等信息。
- 使用颜色编码(如
.good
、.bad
类)直观区分姿势状态(绿色为良好,红色为不良)。
-
统计卡片:
- 采用网格布局(Grid)展示关键指标(如良好 / 不良姿势时间、触发次数),提升信息可读性。
- 大字体数值(如
stat-value
类)突出核心数据,便于快速浏览。
2. CSS 样式优化
/* 关键样式片段 */
body { background: #1a1a1a; color: white; }
.status-bar { background: #333; border-radius: 8px; }
.good { color: #2ecc71; } /* 绿色 */
.bad { color: #e74c3c; } /* 红色 */
.unknown { color: #f39c12; } /* 橙色 */
-
暗黑主题:
- 背景色采用深色调(#1a1a1a、#333),减少视觉疲劳,适合长时间监控场景。
- 关键状态(如姿势结果)使用高对比度颜色(绿 / 红),增强信息辨识度。
-
响应式布局:
flex
和grid
布局确保在桌面、平板、手机等设备上正确显示。max-width: 100%
和border-radius
提升界面美观度和适配性。
3. JavaScript 交互逻辑
setInterval(() => {fetch('/status').then(res => res.json()).then(data => {// 更新FPS、人脸数量等状态栏信息document.getElementById('fps').textContent = data.fps;// 更新姿势状态颜色const postureStatus = document.getElementById('posture-status');postureStatus.className = `status-value ${data.posture_status.toLowerCase()}`;// 更新统计卡片数据document.getElementById('good-time').textContent = `${data.posture_data.good_time}s`;})
}, 1000);
-
实时数据拉取:
- 每秒调用
fetch('/status')
获取最新状态数据,通过JSON
解析后更新页面元素。 - 使用
textContent
而非innerHTML
避免 XSS 风险,确保安全性。
- 每秒调用
-
动态样式更新:
- 根据姿势状态(
Good
/Bad
/Unknown
)动态添加 CSS 类,改变文本颜色(如.good
对应绿色)。 - 通过
className
属性批量修改样式,避免重复操作 DOM 元素。
- 根据姿势状态(
-
视频流刷新机制:
<img src="/video_feed">
会自动处理multipart/x-mixed-replace
响应,无需 JavaScript 干预,简化实现逻辑。
三、关键技术细节与优化
1. 视频流传输效率
-
JPEG 压缩:
- 通过
cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 60])
将视频帧压缩为 JPEG 格式,质量参数设为 60(平衡画质与文件大小)。 - 压缩后单帧大小约为 10-20KB,适合在局域网中传输(若需公网访问,可进一步降低质量或使用 H.264 编码)。
- 通过
-
多部分响应格式:
--frame\r\n Content-Type: image/jpeg\r\n\r\n [JPEG数据块]\r\n --frame\r\n ...
- 每个帧数据块以
--frame
分隔,浏览器会自动丢弃旧帧并显示最新帧,实现 “伪实时” 流(延迟约 1 秒)。
- 每个帧数据块以
2. 线程安全与数据一致性
- 锁机制:
- 在
web_streamer.update_frame
和web_streamer.generate
中使用threading.Lock
,确保同一时刻只有一个线程操作img_encoded
等共享变量。 - 避免多线程下的竞态条件(Race Condition),防止视频流出现花屏或数据错乱。
- 在
3. 模板动态生成
# 写入HTML模板
with open(os.path.join(template_dir, 'index.html'), 'w') as f:f.write('''<!-- 硬编码的HTML内容 -->''')
- 动态创建模板:
- 程序启动时自动生成
templates/index.html
文件,无需手动创建模板目录。 - 适合简易场景或容器化部署(如 Docker),但生产环境中建议使用静态模板文件。
- 程序启动时自动生成
四、扩展与优化方向
1. 性能优化
- HTTP/2 支持:
- 升级 Web 服务器(如 Nginx+Gunicorn)支持 HTTP/2,减少视频流传输的延迟和带宽占用。
- 缓存策略:
- 对静态资源(CSS/JS)设置缓存头(
Cache-Control
),减少重复请求。
- 对静态资源(CSS/JS)设置缓存头(
2. 功能扩展
- 用户认证:
- 添加
/login
路由和会话管理(如 Flask-Login),确保只有授权用户可访问监控页面。
- 添加
- 历史数据存储:
- 将姿势状态、人脸识别记录存入数据库(如 SQLite/MySQL),提供历史查询和统计图表。
- 移动端适配:
- 使用媒体查询(
@media
)优化移动端布局,或开发 PWA(渐进式 Web 应用)支持离线访问。
- 使用媒体查询(
3. 协议扩展
- RTSP 流支持:
- 集成
ffmpeg
将视频流转换为 RTSP 格式,适配安防监控设备(如 NVR)。
- 集成
- WebSocket 通信:
- 改用 WebSocket 实现双向通信(如实时控制硬件、发送指令),替代轮询式的
/status
请求。
- 改用 WebSocket 实现双向通信(如实时控制硬件、发送指令),替代轮询式的
总结
该系统的 Web 服务与前端显示部分通过Flask 的轻量级架构和浏览器原生能力,实现了实时视频流展示与状态监控的高效整合。核心优势包括:
- 低延迟:通过多线程和 HTTP 多部分响应,确保视频流接近实时(约 1 秒延迟)。
- 易部署:无需额外依赖(除 Python 标准库外),可直接在本地或边缘设备运行。
- 可扩展:通过路由和接口设计,方便添加用户认证、数据存储等功能。
适用于需要快速搭建实时监控界面的场景(如智能家居、小型企业安防),若需生产环境部署,建议补充安全认证、日志系统和性能监控等机制。
相关文章:
上位机知识篇---Flask框架实现Web服务
本文将简单介绍Web 服务与前端显示部分,它们基于Flask 框架和HTML/CSS/JavaScript实现,主要负责将实时视频流和检测结果通过网页展示,并提供交互式状态监控。以下是详细技术解析: 一、Flask Web 服务架构 1. 核心路由设计 app.…...
django paramiko 跳转登录
在使用Django框架结合Paramiko进行SSH远程操作时,通常涉及到自动化脚本的执行,比如远程服务器上的命令执行、文件传输等。如果你的需求是“跳转登录”,即在登录远程服务器后,再通过该服务器的SSH连接跳转到另一台服务器࿰…...
Prompt工程学习之思维树(TOT)
思维树 定义:思维树(Tree of Thoughts, ToT) 是一种先进的推理框架,它通过同时探索多条推理路径对思维链(Chain of Thought)** 进行了扩展。该技术将问题解决视为一个搜索过程 —— 模型生成不同的中间步骤…...

基于python大数据的水文数据分析可视化系统
博主介绍:高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实实在…...

人工智能学习09-变量作用域
人工智能学习概述—快手视频 人工智能学习09-变量作用域—快手视频...

DJango知识-模型类
一.项目创建 在想要将项目创键的目录下,输入cmd (进入命令提示符)在cmd中输入:Django-admin startproject 项目名称 (创建项目)cd 项目名称 (进入项目)Django-admin startapp 程序名称 (创建程序)python manage.py runserver 8080 (运行程序)将弹出的网址复制到浏览器中…...
结构性-代理模式
动态代理主要是为了处理重复创建模板代码的场景。 使用示例 public interface MyInterface {String doSomething(); }public class MyInterfaceImpl implements MyInterface{Overridepublic String doSomething() {return "接口方法dosomething";} }public class M…...

【Redis】笔记|第10节|京东HotKey实现多级缓存架构
缓存架构 京东HotKey架构 代码结构 代码详情 功能点:(如代码有错误,欢迎讨论纠正) 多级缓存,先查HotKey缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新…...
Java中Git基础操作详解(clone、commit、push、branch)
Git是Java开发者必备的版本控制工具,以下是核心操作的详细说明及示例: 一、Git基础概念 仓库(Repository):存储代码的目录,包含所有版本历史。提交(Commit)…...

基于规则的自然语言处理
基于规则的自然语言处理 规则方法形态还原(针对英语、德语、法语等)中文分词切分歧义分词方法歧义字段消歧方法分词带来的问题 词性标注命名实体分类机器翻译规则方法的问题 规则方法 以规则形式表示语言知识,强调人对语言知识的理性整理&am…...

使用MounRiver Studio Ⅱ软件写一个CH592F芯片的ADC采集程序,碰到的问题
MounRiver Studio Ⅱ 默认是不开启浮点计算的,所以有些浮点功能不能用,碰到问题是 while (1) {DelayMs (100);tmp Read_Temperature (0);sprintf (tempBuffer, "temp:%.2f\r\n", tmp); // 格式化温度值到字符串。使用%f要开启相应的…...

简约商务年终工作总结报告PPT模版分享
简约精致扁平化商务通用动画PPT模版,简约大气素雅商务PPT模版,商务PPT模版,商业计划书PPT模版,IOS风商务通用PPT模版,公司介绍企业宣传PPT模版,创业融资PPT模版,创意低多边形PPT模版,…...

深度学习学习率优化方法——pytorch中各类warm up策略
warm-up具体原理以及为什么这么做在之前的博客有介绍,这里直接介绍如何直接使用pytorch中的warm-up策略,在pytorch中对于warm-up所有支持的方法都有描述,可以直接阅读1。 深度学习中各类学习率优化方法(AdaGrad/RMSprop/Adam/Warm-UP)原理及其…...

分类数据集 - 场景分类数据集下载
数据集介绍:自然场景分类数据集,真实场景高质量图片数据;适用实际项目应用:自然场景下场景分类项目,以及作为通用场景分类数据集场景数据的补充;数据集类别:buildings、forest、glacier、mounta…...

leetcode.多数元素
169. 多数元素 - 力扣(LeetCode) import java.util.HashMap;public class LeetCode169 {public int majorityElement(int[] nums) {int count nums.length;int res count/2;Scanner scanner new Scanner(System.in);HashMap<Integer,Integer> …...

Server - 使用 Docker 配置 PyTorch 研发环境
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/148421901 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 建议使…...

2025年渗透测试面试题总结-腾讯[实习]安全研究员(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]安全研究员 1. 自我介绍 2. SQL二次注入原理 3. 二次注入修复方案 4. SQL注入绕WAFÿ…...
Vue:Form正则校验
目录 1. 只能输入正整数或正小数(保留三位小数) 1. 只能输入正整数或正小数(保留三位小数) cc: [{required: true, message: "钻杆长度不能为空", trigger: "blur" },{pattern: /^\d(\.\d{1,3})?$/, message: 只能输入正整数或正小数(保留三位小数), tri…...
如何处理React中表单的双向数据绑定?
在前端开发中,双向数据绑定(Two-way Data Binding)是指视图(View)与数据模型(Model)之间保持同步:当模型发生变化时,视图会自动更新;当视图(用户输…...
时间序列预测的机器学习方法:从基础到实战
时间序列预测是机器学习中一个重要且实用的领域,广泛应用于金融、气象、销售预测、资源规划等多个行业。本文将全面介绍时间序列预测的基本概念、常用方法,并通过Python代码示例展示如何构建和评估时间序列预测模型。 1. 时间序列预测概述 时间序列是按…...

01-VMware16虚拟机详细安装
官网地址:https://www.vmware.com/cn.html 1.1 打开下载好的 .exe 文件, 双击安装。 1.2 点击下一步 1.3 先勾选我接受许可协议中的条款,然后点击下一步 1.4 自定义安装路径,注意这里的文件路径尽量不要包含中文,完成…...

sql列中数据通过逗号分割的集合,按需求剔除部分值
前置 不会REGEXP 方法的需要在这里学习一下下 记sql字段逗号分隔,通过list查询 功能点 现有一个表格中一列存储的是标签的集合,通过逗号分割 入下: 其中tag_ids是逗号分割的标签,现在需要删除标签组中的一些标签,因…...

下一代设备健康管理解决方案:基于多源异构数据融合的智能运维架构
导语: 在工业4.0深度演进的关键节点,传统设备管理面临数据孤岛、误诊率高、运维滞后三大致命瓶颈。本文解析基于边缘智能与数字孪生的新一代解决方案架构,并实测验证中讯烛龙PHM-X系统如何通过多模态感知→智能诊断→自主决策闭环,…...
unipp---HarmonyOS 应用开发实战
HarmonyOS 应用开发实战指南 1. 开篇:为什么选择 HarmonyOS? 最近在开发鸿蒙应用时,发现很多开发者都在问:为什么要选择 HarmonyOS?这里分享一下我的看法: 生态优势 华为手机用户基数大,市场潜…...
Go 语言中switch case条件分支语句
1. 基本语法 package main import "fmt" func main() {var extname ".css"switch extname {case ".html":fmt.Println("text/html")case ".css":fmt.Println("text/css") // text/csscase ".js":fmt.…...
ai流式文字返回前端和php的处理办法
PHP后端 php端主要是用到ob_flush和flush,头改为流式。 基本代码 代码如下: <?php header(Content-Type:text/event-stream); header(Cache-Control:no-cache); header(Connection:keep-alive);function streamPostRequest($url,$data){$chcurl_…...

深入理解JavaScript设计模式之闭包与高阶函数
目录 前言小序一场失败面试面试后的觉醒 闭包变量作用域:谁的地盘听谁的变量的生命周期:该走了,不该走的还在闭包的更多作用:不只是谈恋爱,还能干活!1、封装私有变量:你的变量我来守护2、延长变…...
【Unity】R3 CSharp 响应式编程 - 使用篇(二)
一、通用的事件监听用法 using System;using R3;using UnityEngine;namespace Aladdin.Standard.Observable.Common{public class CommonObservable : MonoBehaviour{// 默认会调用1次public SerializableReactiveProperty<int> serializableReactiveProperty;…...

springboot启动mapper找不到方法对应的xml
数据源配置 目录结构 idea中mapper.java 可以找到对应的mapper.xml文件 启动却找不到 因为mapper.db1会被识别为文件名 而非目录结构 调整为这种...

MQTT协议:物联网时代的通信基石
MQTT协议:物联网时代的通信基石 在当今快速发展的物联网(IoT)时代,设备之间的通信变得尤为重要。MQTT(Message Queuing Telemetry Transport)协议作为一种轻量级的消息传输协议,正逐渐成为物联…...