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

这篇具有很好参考价值的文章主要介绍了【OpenCV DNN】Flask 视频监控目标检测教程 04。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


本系列从零开始,详细讲解使用 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-30

from flask import Flask, Response, render_template, request
import cv2
import numpy as np
import time

app = 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) * 128
        cv2.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,就可以看到模拟视频源生成的视频流。

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


Flask04 完整例程

cvFlask04 项目的文件树

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


cvFlask04.py

# cvFlask04.py
# OpenCV+Flask 图像处理例程 04
# 在网页上显示模拟视频源的图像
# Copyright 2023 Youcans, XUPT
# Crated:2023-4-30

from flask import Flask, Response, render_template, request
import cv2
import numpy as np
import time

app = 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) * 128
        cv2.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文章来源地址https://www.toymoban.com/news/detail-460689.html


到了这里,关于【OpenCV DNN】Flask 视频监控目标检测教程 04的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

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

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

    欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 01 本系列从零开始,详细讲解使用 Flask 框架构建 OpenCV DNN 模型的 Web 应用程序。 将OpenCV DNN模型部署到Web端,不需要安装任何依赖,只需要访问Web地址就可以访问和运行应用程序。 面向P

    2024年02月07日
    浏览(11)
  • 【OpenCV DNN】Flask 视频监控目标检测教程 09

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

    欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中 本系列从零开始,详细讲解使用 Flask 框架构建 OpenCV DNN 模型的 Web 应用程序。本节使用多线程或者异步框架来处理视频帧的获取和人脸识别。 本例程使用一个线程实时获取视频帧,在主线程中处理视频帧,进行人脸识别和图像编

    2024年02月13日
    浏览(29)
  • 【OpenCV DNN】Flask 视频监控目标检测教程 10

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

    欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中 本系列从零开始,详细讲解使用 Flask 框架构建 OpenCV DNN 模型的 Web 应用程序。 在上节的基础上,本节介绍使用OpenCV DNN对实时视频进行目标检测。DNN目标检测的基本步骤也是加载图像、模型设置和模型推理。 在上节的基础上,本

    2024年02月10日
    浏览(9)
  • 【OpenCV DNN】Flask 视频监控目标检测教程 04

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

    欢迎关注『OpenCV DNN @ Youcans』系列,持续更新中 本系列从零开始,详细讲解使用 Flask 框架构建 OpenCV DNN 模型的 Web 应用程序。 本节介绍用Flask构建流媒体服务器,向服务器发送请求可以获取模拟视频源产生的视频图像。 我们的第四个例程,使用Flask框架构建一个视频流服务器

    2024年02月06日
    浏览(28)
  • 基于视频技术与AI检测算法的体育场馆远程视频智能化监控方案

    基于视频技术与AI检测算法的体育场馆远程视频智能化监控方案

    一、方案背景 近年来,随着居民体育运动意识的增强,体育场馆成为居民体育锻炼的重要场所。但使用场馆内的器材时,可能发生受伤意外,甚至牵扯责任赔偿纠纷问题。同时,物品丢失、人力巡逻成本问题突出,体育场馆在给居民提供运动场地的同时,还需特别关注场馆内

    2024年02月07日
    浏览(12)
  • opencv系列(1)--使用opencv和Qt6做一个视频监控器人脸识别

    这个程序是自己的下班之后,看看那个坏东西想来偷看我的电脑。我就随手做的一个程序。 1.能都显示摄像头的内容。 2.如果有人进入摄像头。 3.利用opencv的模型识别人脸,识别到了就保存到自己的电脑里面。 4.并把他的照片显示到界面上一段时间,告诉他,偷窥有罪。 5.程

    2024年02月11日
    浏览(14)
  • 安防监控视频AI智能分析网关V4离岗检测算法配置步骤来啦

    安防监控视频AI智能分析网关V4离岗检测算法配置步骤来啦

    我们的AI边缘计算网关硬件 —— 智能分析网关目前有5个版本:V1、V2、V3、V4、V5,每个版本都能实现对监控视频的智能识别和分析,支持抓拍、记录、告警等,每个版本在算法模型及性能配置上略有不同。硬件可实现的 AI 检测包括:人脸结构化数据、车辆结构化数据、场景检

    2024年02月07日
    浏览(10)
  • opencv dnn模块 示例(19) 目标检测 object_detection 之 yolox

    opencv dnn模块 示例(19) 目标检测 object_detection 之 yolox

    YOLOX是旷视科技在2021年发表,对标YOLO v5。YOLOX中引入了当年的黑科技主要有三点,decoupled head、anchor-free以及advanced label assigning strategy(SimOTA)。YOLOX的性能如何呢,可以参考原论文图一如下图所示。YOLOX比当年的YOLO v5略好一点,并且利用YOLOX获得当年的Streaming Perception Challenge第一

    2024年02月06日
    浏览(12)
  • 树莓派利用python-opencv使用CSI摄像头调用监控视频

    树莓派利用python-opencv使用CSI摄像头调用监控视频

    目录 一、安装python-opencv。 二、使用工具Xshell7和MobaXterm 三、连接并打开CSI摄像头 3.1连线如图所示: 3.2打开摄像头 四、编写摄像头代码调用摄像头         一定要选择配置好的安装python-opencv,不要去配置安装,然后还cmake编译,没有必要基本上安装过程都会报2-3个错误,还

    2023年04月17日
    浏览(13)
  • 【教程】视频汇聚/视频监控管理平台EasyCVR录像存储功能如何优化?具体步骤是什么?

    【教程】视频汇聚/视频监控管理平台EasyCVR录像存储功能如何优化?具体步骤是什么?

    视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。视频监控系统EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警

    2024年02月07日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包