欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中

【OpenCV DNN】Flask 视频监控目标检测教程 04

  • 3.4 用Flask构建流媒体服务器
    • 3.4.1 流媒体服务器基本知识
    • 3.4.2 用Flask搭建流媒体服务器
  • Flask04 完整例程
    • cvFlask04 项目的文件树
    • cvFlask04.py
    • index1.html

本系列从零开始,详细讲解使用 Flask 框架构建 OpenCV DNN 模型的 Web 应用程序。

本节介绍用Flask构建流媒体服务器,向服务器发送请求可以获取模拟视频源产生的视频图像。

3.4 用Flask构建流媒体服务器

我们的第四个例程,使用Flask框架构建一个视频流服务器,向服务器发送请求可以获取模拟视频源产生的视频图像。本例使用模拟视频源,是为了避免硬件配置和视频延迟的影响,构建一个极简的视频流服务器。

3.4.1 流媒体服务器基本知识

我们首先介绍流媒体服务器的基本知识。

流是一种让服务器在响应请求时将响应数据分块的技术。针对视频数据量大、实时性要求高的特点,把应答数据分成小块数据,服务器以数据块的形式响应请求,分块传输给客户端来实现流媒体服务器,因此响应返回请求就不会随视频数据而变大

另外,在视频流的返回播放时,视频流可以让每个块替换页面中的前一个块,来实现在浏览器窗口中的“播放”。

Multipart响应包含一个multipart媒体类型的标头,后面跟着多块独立的数据,每块数据有自己的Content-Type。Multipart有多种不同类型,针对流媒体我们使用multipart/x-mixed-replace。以下是Multipart视频流的结构:

HTTP/1.1 200 OK
Content-Type: multipart/x-mixed-replace; boundary=frame--frame
Content-Type: image/jpeg<jpeg data here>
--frame
Content-Type: image/jpeg<jpeg data here>
...

3.4.2 用Flask搭建流媒体服务器

下面我们使用Flask搭建一个简单的流媒体服务器。

Flask使用生成器(generator function)原生支持流式响应,生成器可以中断和恢复,可以一次返回多个值。一个返回流式响应的路由,需要返回参数为生成器的Response对象。Flask负责调用生成器,将Response对象分成数据块,使用Multipart Responses来组装一个HTTP应答,将数据块发送给客户端。

使用Motion JPEG方法,将视频画面逐帧发送给浏览器,浏览器逐帧替换来实现视频的播放功能。这也是很多IP Camera的流媒体播放方式,实时性很好,但视频质量不是很理想。

新建一个Flask项目。cvFlask04项目的文件树如下。

---项目文件名\|---templates\|    |---index1.html
|--- cvFlask04.py

任务逻辑由Python程序文件cvFlask04.py实现,完整代码如下。

# cvFlask04.py
# OpenCV+Flask 图像处理例程 04
# 在网页上显示模拟视频源的图像
# Copyright 2023 Youcans, XUPT
# Crated:2023-4-30from flask import Flask, Response, render_template, request
import cv2
import numpy as np
import timeapp = Flask(__name__)# 定义视频流类
class VideoStream(object):def get_frame(self):  # 模拟视频源time.sleep(0.1)ct = time.time()sec_str = str(round(ct - int(ct), 3))img = np.ones((400, 600, 3), np.uint8) * 128cv2.putText(img, sec_str, (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255,255,0), 1)ret, buffer = cv2.imencode('.jpg', img)  # 编码为 jpg 格式img_byte = buffer.tobytes()  # 转换为 bytes 类型return img_byte# 视频流的网页 HTML 模板
@app.route('/')
def index():return render_template('index1.html')# 生成视频流的帧
def gen_frames(camera):while True:frame = camera.get_frame()  # 获取视频帧yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n'+ frame + b'\r\n')  # 生成视频流的帧# 视频流的传输路由:从网页获取视频源,返回视频流
@app.route('/video_feed')
def video_feed():return Response(gene_frames(VideoStream()),content_type='multipart/x-mixed-replace; boundary=frame')if __name__ == '__main__':# 启动本地视频流服务器,激活该网页app.run(host='0.0.0.0', port=5000, debug=True, threaded=True)  # 绑定 IP 地址和端口号

程序cvFlask04.py定义了一个视频流VideoStream类,用于持续地提供视频帧的数据。在本例中使用模拟视频源,将系统时间写在空白画布上来生成模拟视频图像。

程序的index()中指定了视频流的网页模板index1.html。网页index1.html位于templates文件夹,具体内容如下。

<!DOCTYPE html>
<html><head><title>Video Streaming Demonstration</title></head><body><h1>Video Streaming Demonstration</h1><img src="{{ url_for('video_feed') }}"></body>
</html>

其中,img标签定义了图片使用的url,是由url_for()函数返回的、利用视图函数的名字’video_feed’获取的动态url。
/video_feed路径由video_feed()方法提供服务,返回一个multipart应答。生成器函数gen_frames()不断地从VideoStream逐帧获取图片,通过生成器返回给客户端。客户端浏览器收到流媒体时,在img标签定义的图片中逐帧显示,从而实现视频播放。

下面运行cvFlask03的项目脚本。进入cvFlask04项目的根目录,运行程序cvFlask04.py,启动流媒体服务器。

 * Running on all addresses (0.0.0.0)* Running on http://127.0.0.1:5000* Running on http://192.168.3.249:5000

在本地浏览器打开http://127.0.0.1:5000,或在局域网内设备(包括移动手机)浏览器打开http://192.168.3.249:5000,就可以看到模拟视频源生成的视频流。

Flask04 完整例程

cvFlask04 项目的文件树

---项目文件名\|---templates\|    |---index1.html
|--- cvFlask04.py

cvFlask04.py

# cvFlask04.py
# OpenCV+Flask 图像处理例程 04
# 在网页上显示模拟视频源的图像
# Copyright 2023 Youcans, XUPT
# Crated:2023-4-30from flask import Flask, Response, render_template, request
import cv2
import numpy as np
import timeapp = Flask(__name__)# 定义视频流类
class VideoStream(object):def get_frame(self):  # 模拟视频源time.sleep(0.1)ct = time.time()sec_str = str(round(ct - int(ct), 3))img = np.ones((400, 600, 3), np.uint8) * 128cv2.putText(img, sec_str, (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255,255,0), 1)ret, buffer = cv2.imencode('.jpg', img)  # 编码为 jpg 格式img_byte = buffer.tobytes()  # 转换为 bytes 类型return img_byte# 视频流的网页 HTML 模板
@app.route('/')
def index():return render_template('index1.html')# 生成视频流的帧
def gen_frames(camera):while True:frame = camera.get_frame()  # 获取视频帧yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n'+ frame + b'\r\n')  # 生成视频流的帧# 视频流的传输路由:从网页获取视频源,返回视频流
@app.route('/video_feed')
def video_feed():return Response(gene_frames(VideoStream()),content_type='multipart/x-mixed-replace; boundary=frame')if __name__ == '__main__':# 启动本地视频流服务器,激活该网页app.run(host='0.0.0.0', port=5000, debug=True, threaded=True)  # 绑定 IP 地址和端口号

index1.html

<!DOCTYPE html>
<html><head><title>Video Streaming Demonstration</title></head><body><h1>Video Streaming Demonstration</h1><img src="{{ url_for('video_feed') }}"></body>
</html>

【本节完】

下节我们将讨论:使用Flask框架构建一个视频流服务器。

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:
【OpenCV DNN】Flask 视频监控目标检测教程 04(https://blog.csdn.net/youcans/article/details/130865522)
Copyright 2023 youcans, XUPT
Crated:2023-05-25

欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中
【OpenCV DNN】Flask 视频监控目标检测教程 01
【OpenCV DNN】Flask 视频监控目标检测教程 02
【OpenCV DNN】Flask 视频监控目标检测教程 03

【OpenCV DNN】Flask 视频监控目标检测教程 04相关推荐

  1. 【OpenCV DNN】Flask 视频监控目标检测教程 02

    欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中 [OpenCV DNN]Flask 视频监控目标检测教程 01 [OpenCV DNN]Flask 视频监控目标检测教程 02 [ ...

  2. 【OpenCV DNN】Flask 视频监控目标检测教程 07

    欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中 [OpenCV DNN]Flask 视频监控目标检测教程 07 3.7 OpenCV+Flask实时监控人脸识别 cvFlask0 ...

  3. 用opencv的dnn模块做yolov5目标检测

    最近在微信公众号里看到多篇讲解yolov5在openvino部署做目标检测文章,但是没看到过用opencv的dnn模块做yolov5目标检测的.于是,我就想着编写一套用opencv的dnn模块做yol ...

  4. 深度学习 + OpenCV,Python实现实时视频目标检测

    选自PyimageSearch 机器之心编译 参与:路雪.李泽南 使用 OpenCV 和 Python 对实时视频流进行深度学习目标检测是非常简单的,我们只需要组合一些合适的代码,接入实时视频,随后加 ...

  5. OpenCV+YOLO+IP摄像头实现目标检测

    title: OpenCV+YOLO+IP摄像头实现目标检测 前言 学习OpenCV.YOLO到现在我实现了调用本地摄像头使用自己训练的模型进行目标识别,然后想着能不能远程获取视频数据,然后再PC端处 ...

  6. 【mmdetection小目标检测教程】三、使用sahi库切分高分辨率图片,一键生成coco格式数据集

    [mmdetection小目标检测教程]三.使用sahi库切分高分辨率图片,一键生成coco格式数据集 1.确认是否需要切分图像 2.子图切分 (1)安装sahi库 (2)基于sahi切图 本文我们将 ...

  7. 养老院视频监控分析检测算法

    养老院视频监控分析检测算法通过借助计算机视觉深度学习技术以及yolo系列模型架构,对现场人员实时识别检测.Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测,核心思想就是利用整张图 ...

  8. 道路运输车辆卫星定位系统企业监控平台标准符合性检测和道路运输车辆卫星定位系统企业视频监控平台检测攻略...

    卫星定位平台部标平台检测阶段步骤道路运输车辆卫星定位系统企业监控平台标准符合性检测和道路运输车辆卫星定位系统企业视频监控平台检测攻略 最新更新2019年9月9日16:21:37     步骤1.报名 ...

  9. OpenCV实现远程视频监控与运动目标检测

    远程视频监控与运动目标检测 本来是一次网络编程课的大作业,在做的过程中发现了蛮多问题,之后也一一调试完成,总的来说并不复杂,但也学到蛮多东西的,所以打算放上来 目的 随着图像处理技术和无线通信技术的发 ...

最新文章

  1. day13 Java学习(常见对象正则表达式)
  2. 重新认识二级指针(Pointers to Pointers)
  3. Windows辅助开发笔记-辅助开发逻辑思路
  4. c if sortable html,sortable.js中文文档
  5. SQL数据库语言基础之SqlServer条件查询、排序数据表、like模糊查询【大总结】
  6. 20180326-1777-1.2-UMLDOC
  7. 使用freemarker模板生成html文件(二)
  8. JVM监控及诊断工具命令行篇之jstack
  9. 北京购房攻略(4.17)
  10. 服务器系统万能驱动,IT天空万能驱动程序
  11. 高并发系统设计——API网关技术选型
  12. 杀戮空间2服务器修改地图,《杀戮空间2》新地图全任务完成方法图文详解
  13. java读书网站课程设计_Java课程设计
  14. 如何让好习惯成为你人生中的一部分
  15. 微信公众号平台如何批量给粉丝自动打标签分组
  16. 计算机教研评课记录,信息技术2.0 | 评课磨课共成长 信息技术促进步 ——东光县第二实验小学信息技术2.0数学组 课例研讨...
  17. Unity 图片拼接中间有空隙问题详解
  18. 短线绝招--潜龙出海
  19. 冠词 article
  20. Unexpected end of JSON input while parsing near ‘...“解决方法

热门文章

  1. 服务器错误码显示,常见错误码说明
  2. ECSHOP v2.5数据库字典
  3. 60句高逼格的文言文,不收藏绝对是你的损失!
  4. MyEclipse 2015 Windows版下载地址(已更新最新版Stable 3.0)
  5. 首次运行 IntelliJ IDEA旗舰版
  6. 爬虫遇到合并单元格(爬虫快速处理网页表格)
  7. 如何在百度搜索结果中屏蔽不显示某些指定垃圾网站?
  8. Agile 是什么?
  9. TikTok新规:严禁录播盗播,保护原创内容
  10. android NFC 开发学习笔记(1)