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

上位机知识篇---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),减少视觉疲劳,适合长时间监控场景。
    • 关键状态(如姿势结果)使用高对比度颜色(绿 / 红),增强信息辨识度。
  • 响应式布局

    • flexgrid布局确保在桌面、平板、手机等设备上正确显示。
    • 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_frameweb_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),减少重复请求。
2. 功能扩展
  • 用户认证
    • 添加/login路由和会话管理(如 Flask-Login),确保只有授权用户可访问监控页面。
  • 历史数据存储
    • 将姿势状态、人脸识别记录存入数据库(如 SQLite/MySQL),提供历史查询和统计图表。
  • 移动端适配
    • 使用媒体查询(@media)优化移动端布局,或开发 PWA(渐进式 Web 应用)支持离线访问。
3. 协议扩展
  • RTSP 流支持
    • 集成ffmpeg将视频流转换为 RTSP 格式,适配安防监控设备(如 NVR)。
  • WebSocket 通信
    • 改用 WebSocket 实现双向通信(如实时控制硬件、发送指令),替代轮询式的/status请求。

总结

该系统的 Web 服务与前端显示部分通过Flask 的轻量级架构浏览器原生能力,实现了实时视频流展示与状态监控的高效整合。核心优势包括:

  • 低延迟:通过多线程和 HTTP 多部分响应,确保视频流接近实时(约 1 秒延迟)。
  • 易部署:无需额外依赖(除 Python 标准库外),可直接在本地或边缘设备运行。
  • 可扩展:通过路由和接口设计,方便添加用户认证、数据存储等功能。

适用于需要快速搭建实时监控界面的场景(如智能家居、小型企业安防),若需生产环境部署,建议补充安全认证、日志系统和性能监控等机制。

相关文章:

上位机知识篇---Flask框架实现Web服务

本文将简单介绍Web 服务与前端显示部分&#xff0c;它们基于Flask 框架和HTML/CSS/JavaScript实现&#xff0c;主要负责将实时视频流和检测结果通过网页展示&#xff0c;并提供交互式状态监控。以下是详细技术解析&#xff1a; 一、Flask Web 服务架构 1. 核心路由设计 app.…...

django paramiko 跳转登录

在使用Django框架结合Paramiko进行SSH远程操作时&#xff0c;通常涉及到自动化脚本的执行&#xff0c;比如远程服务器上的命令执行、文件传输等。如果你的需求是“跳转登录”&#xff0c;即在登录远程服务器后&#xff0c;再通过该服务器的SSH连接跳转到另一台服务器&#xff0…...

Prompt工程学习之思维树(TOT)

思维树 定义&#xff1a;思维树&#xff08;Tree of Thoughts, ToT&#xff09; 是一种先进的推理框架&#xff0c;它通过同时探索多条推理路径对思维链&#xff08;Chain of Thought&#xff09;** 进行了扩展。该技术将问题解决视为一个搜索过程 —— 模型生成不同的中间步骤…...

基于python大数据的水文数据分析可视化系统

博主介绍&#xff1a;高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实实在…...

人工智能学习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架构 代码结构 代码详情 功能点&#xff1a;&#xff08;如代码有错误&#xff0c;欢迎讨论纠正&#xff09; 多级缓存&#xff0c;先查HotKey缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新…...

Java中Git基础操作详解(clone、commit、push、branch)

Git是Java开发者必备的版本控制工具&#xff0c;以下是核心操作的详细说明及示例&#xff1a; ​​一、Git基础概念​​ ​​仓库&#xff08;Repository&#xff09;​​&#xff1a;存储代码的目录&#xff0c;包含所有版本历史。​​提交&#xff08;Commit&#xff09;​​…...

基于规则的自然语言处理

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

使用MounRiver Studio Ⅱ软件写一个CH592F芯片的ADC采集程序,碰到的问题

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

简约商务年终工作总结报告PPT模版分享

简约精致扁平化商务通用动画PPT模版&#xff0c;简约大气素雅商务PPT模版&#xff0c;商务PPT模版&#xff0c;商业计划书PPT模版&#xff0c;IOS风商务通用PPT模版&#xff0c;公司介绍企业宣传PPT模版&#xff0c;创业融资PPT模版&#xff0c;创意低多边形PPT模版&#xff0c…...

深度学习学习率优化方法——pytorch中各类warm up策略

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

分类数据集 - 场景分类数据集下载

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

leetcode.多数元素

169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 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&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/148421901 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 建议使…...

2025年渗透测试面试题总结-腾讯[实习]安全研究员(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]安全研究员 1. 自我介绍 2. SQL二次注入原理 3. 二次注入修复方案 4. SQL注入绕WAF&#xff…...

Vue:Form正则校验

目录 1. 只能输入正整数或正小数(保留三位小数) 1. 只能输入正整数或正小数(保留三位小数) cc: [{required: true, message: "钻杆长度不能为空", trigger: "blur" },{pattern: /^\d(\.\d{1,3})?$/, message: 只能输入正整数或正小数(保留三位小数), tri…...

如何处理React中表单的双向数据绑定?

在前端开发中&#xff0c;双向数据绑定&#xff08;Two-way Data Binding&#xff09;是指视图&#xff08;View&#xff09;与数据模型&#xff08;Model&#xff09;之间保持同步&#xff1a;当模型发生变化时&#xff0c;视图会自动更新&#xff1b;当视图&#xff08;用户输…...

时间序列预测的机器学习方法:从基础到实战

时间序列预测是机器学习中一个重要且实用的领域&#xff0c;广泛应用于金融、气象、销售预测、资源规划等多个行业。本文将全面介绍时间序列预测的基本概念、常用方法&#xff0c;并通过Python代码示例展示如何构建和评估时间序列预测模型。 1. 时间序列预测概述 时间序列是按…...

01-VMware16虚拟机详细安装

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

sql列中数据通过逗号分割的集合,按需求剔除部分值

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

下一代设备健康管理解决方案:基于多源异构数据融合的智能运维架构

导语&#xff1a; 在工业4.0深度演进的关键节点&#xff0c;传统设备管理面临数据孤岛、误诊率高、运维滞后三大致命瓶颈。本文解析基于边缘智能与数字孪生的新一代解决方案架构&#xff0c;并实测验证中讯烛龙PHM-X系统如何通过多模态感知→智能诊断→自主决策闭环&#xff0c…...

unipp---HarmonyOS 应用开发实战

HarmonyOS 应用开发实战指南 1. 开篇&#xff1a;为什么选择 HarmonyOS&#xff1f; 最近在开发鸿蒙应用时&#xff0c;发现很多开发者都在问&#xff1a;为什么要选择 HarmonyOS&#xff1f;这里分享一下我的看法&#xff1a; 生态优势 华为手机用户基数大&#xff0c;市场潜…...

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&#xff0c;头改为流式。 基本代码 代码如下&#xff1a; <?php header(Content-Type:text/event-stream); header(Cache-Control:no-cache); header(Connection:keep-alive);function streamPostRequest($url,$data){$chcurl_…...

深入理解JavaScript设计模式之闭包与高阶函数

目录 前言小序一场失败面试面试后的觉醒 闭包变量作用域&#xff1a;谁的地盘听谁的变量的生命周期&#xff1a;该走了&#xff0c;不该走的还在闭包的更多作用&#xff1a;不只是谈恋爱&#xff0c;还能干活&#xff01;1、封装私有变量&#xff1a;你的变量我来守护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协议&#xff1a;物联网时代的通信基石 在当今快速发展的物联网&#xff08;IoT&#xff09;时代&#xff0c;设备之间的通信变得尤为重要。MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;协议作为一种轻量级的消息传输协议&#xff0c;正逐渐成为物联…...