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

news2024/11/25 3:04:20

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

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

    • 3.6 OpenCV+Flask实时监控和视频播放
      • cvFlask06 项目的文件树
      • cvFlask06 项目的程序文件
      • cvFlask06 项目的网页模板
      • cvFlask06 项目的运行


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

本节介绍用 Flask 构建流媒体服务器,通过OpenCV捕获摄像头的实时画面,向服务器发送请求可以播放实时的视频流。也可以播放本地视频文件。


3.6 OpenCV+Flask实时监控和视频播放

本例程使用Flask框架构建一个视频流服务器,通过OpenCV捕获摄像头的实时画面,向服务器发送请求可以播放实时的视频流。

OpenCV提供的视频处理类VideoCapture既可以处理视频文件,也可以处理摄像头设备。创建视频读取或捕获对象、读取视频文件或设备的函数也相同,区别仅在于:在读取视频文件或读取视频流时,通过filename指定视频文件或视频流的路径;在使用摄像头时,通过index定义摄像头的ID号。

本项目的框架与cvFlask05相同,主要区别在于从网页获取视频文件路径名称和使用OpenCV读取视频文件。


cvFlask06 项目的文件树

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

---文件名\
    |---templates\
    |    |---index4.html
    |    |---index5.html
|--- cvFlask06.py
|--- vedio_01.mp4

cvFlask06 项目的程序文件

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

# cvFlask06.py
# OpenCV+Flask 图像处理例程 06
# 通过浏览器播放摄像头实时监控视频
# Copyright 2023 Youcans, XUPT
# Crated:2023-4-30
# coding:utf-8

from flask import Flask, Response, request, render_template
import cv2

app = Flask(__name__)  # 实例化 Flask 对象

# 定义视频流类
class VideoStream:
    def __init__(self, source):  # 传入视频源
        if source == 'camera':
            self.video_capture = cv2.VideoCapture(0)  # 使用摄像头
        else:
            self.video_capture = cv2.VideoCapture(source)  # 使用视频文件

    def get_frame(self):
        success, frame = self.video_capture.read()  # 读取视频帧
        if not success:
            return None
        ret, buffer = cv2.imencode('.jpg', frame)  # 编码为 jpg 格式
        frame_byte = buffer.tobytes()  # 转换为 bytes 类型
        return frame_byte

    def __del__(self):
        self.video_capture.release()  # 释放视频流

# 生成视频流的帧
def gen_frames(video_source):
    video_stream = VideoStream(video_source)  # 从视频文件获取视频流
    while True:
        frame = video_stream.get_frame()  # 获取视频帧
        if frame is None:
            break
        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():
    video_source = request.args.get('video_source', 'camera')  # 从网页获取视频源
    return Response(gen_frames(video_source), mimetype='multipart/x-mixed-replace; boundary=frame')

@app.route('/')
def index_camera():  # 实时视频监控
    # <img src="{{ url_for('video_feed', video_source='camera') }}">
    return render_template('index4.html')

@app.route('/vidfile')
def index_vidfile():  # 播放视频文件
    # <img src="{{ url_for('video_feed', video_source='vedio_01.mp4') }}">
    return render_template('index5.html')

if __name__ == '__main__':
    # 启动一个本地开发服务器,激活该网页
    print("URL: http://127.0.0.1:5000")
    app.run(host='0.0.0.0', port=5000, debug=True, threaded=True)  # 绑定 IP 地址和端口号

cvFlask06 项目的网页模板

在子程序index()中指定了视频流的网页模板index4.html。

网页index4.html位于templates文件夹,具体内容如下。

<!DOCTYPE html>
<html>
  <head>
    <title>Video Streaming Demonstration</title>
  </head>
  <body>
    <h2  align="center">OpenCV+Flask 例程:实时视频监控</h2>
    <div style="text-align:center; padding-top:inherit">
      <img src="{{ url_for('video_feed', video_source='camera') }}" width="600"; height="360">
    </div>
  </body>
</html>

网页index5.html位于templates文件夹,具体内容如下。

<!DOCTYPE html>
<html>
  <head>
    <title>Video Streaming Demonstration</title>
  </head>
  <body>
    <h2  align="center">OpenCV+Flask 例程:播放视频文件</h2>
    <div style="text-align:center; padding-top:inherit">
      <img src="{{ url_for('video_feed', video_source='vedio_01.mp4') }}" width="600"; height="360">
    </div>
  </body>
</html>

cvFlask06 项目的运行

进入cvFlask06项目的根目录,运行程序cvFlask06.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://192.168.3.249:5000就可以播放实时视频监控画面:

在这里插入图片描述

打开http://192.168.3.249:5000/vidfile就可以播放视频文件。
在这里插入图片描述


【本节完】

下节我们将讨论:OpenCV+Flask 实时监控人脸识别。


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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/644374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python排序算法实现及其应用

Python排序算法实现及其应用 排序是计算机科学中最基础也是最常用的算法之一。在数据分析、数据挖掘和机器学习等领域&#xff0c;排序算法有着广泛的应用。Python作为一种流行的编程语言&#xff0c;在排序方面具有一定的优势。本文将介绍一些常见的Python排序算法实现以及应…

有趣的图(三)(57)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日主题 咱们之前分别学习了图的基本概念&#xff0c;和图的深度优先遍历算法dfs。 你学会了吗&#xff1f; 咱们今天要学…

Linux系统的tty架构及UART驱动详解

​一、模块硬件学习 1.1. Uart介绍 通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称为UART&#xff0c;是一种异步收发传输器&#xff0c;是电脑硬件的一部分。它将要传输的资料在串行通信与并行通信之间加以转换。 作为把并…

面试问题总结----C/C++部分

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应用,有接触SLAM、Linux、ROS、C/C++、DJI OSDK等; 3、参加工作后…

C++程序流程结构

目录 程序流程结构 一、选择结构 1.1 If语句 1.2 三目运算符 1.3 switch语句 二、循环结构 2.1 while 循环语句 2.2 do…while循环 2.3 for循环 2.4 嵌套循环 三、跳转语句 3.1 break语句 3.2 continue 语句 3.3 goto语句 程序流程结构 C/C支持最基本的三种程…

20230623在WIN10安装PROTEL DXP2004(STEP-BY-STEP)

20230623在WIN10安装PROTEL DXP2004&#xff08;STEP-BY-STEP&#xff09; https://xiazai.zol.com.cn/detail/43/428470.shtml Protel DXP 2004 https://www.onlinedown.net/soft/580490.htm Protel DXP 2004 DXP2004 安装步骤 Failed To load Parallel Port Driver Welcom…

vue或react中修改组件样式的方法

vue或react中修改组件样式的方法 从组件库中引入的组件深度选择器&#xff1a;deep和&#xff1a;global深度选择器在scss中的使用关键点 常规的组件样式修改vue中的样式修改react中的样式修改 从组件库中引入的组件 深度选择器&#xff1a;deep和&#xff1a;global 在 Vue …

Python 算法交易实验63 关于回测

说明 项目结束了&#xff0c;这几天把量化第一版搭起来&#xff0c;量化很重要&#xff0c;现在可以迈出第一步了。首先要关注的是回测&#xff0c;和前不久写的这篇文章呼应&#xff0c;测试的确是一个相对独立&#xff0c;又非常重要的部件。过去比较少关注在方面上&#xf…

数据分析案例-航空公司满意度数据可视化

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【瑞萨RA_FSP】ADC——电压采集

文章目录 一、ADC简介二、ADC的结构框图1. 电压输入范围2. 工作模式3. 转换过程顺序4. 触发源5. ADC转换时间6. 数据寄存器7. 电压转换 一、ADC简介 ADC即模拟数字转换器&#xff0c;ADC英文全称&#xff08;Analog-to-digital converter&#xff09;&#xff0c; 是一种用于将…

Delphi XE10 dxLayoutControl 控件应用指南

Delphi XE10 dxLayoutControl 控件应用指南 DevExpress VCL套件是一套非常强大的界面控件&#xff0c;可惜关于Delphi开发方面的说明太少&#xff0c;有些控件使用起来一头雾水&#xff0c;不知从何下手。本节详细介绍在Delphi Xe10 Seattle中如何利用dxLayoutControl 控件来做…

MMENGINE.LOGGING

MMENGINE.LOGGING 文章目录 MMENGINE.LOGGING[Print_log](https://mmengine.readthedocs.io/zh_CN/latest/api/generated/mmengine.logging.print_log.html "Print_log")[MMENGINE.LOGGING.LOGGER 源代码](https://mmengine.readthedocs.io/zh_CN/latest/_modules/mm…

Rust每日一练(Leetday0030) 合并有序数组、格雷编码、子集II

目录 88. 合并两个有序数组 Merge Sorted Array &#x1f31f;  89. 格雷编码 Gray Code &#x1f31f;&#x1f31f; 90. 子集 II Subsets II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Py…

计算机网络-网络体系结构

目录 计算机网络的基本概念计算机网络的定义组成与功能计算机网络的分类按照网络的作用范围进行分类按照网络的使用者进行分类 计算机网络主要性能指标 计算机网络体系结构计算机网络协议、接口、服务等概念ISO/OSI 参考模型和 TCP/IP 模型OSI七层模型TCP/IP 模型封装与分用 计…

[Hadoop之Hive安装配置 第二篇 ]

前言: 记录一下Hive笔记 目录 前言: Hive的基本简介,使用场景介绍 安装地址: 官网的Hive文档地址: 官网 Hive 的教程地址 Hive安装涉及到的应用介绍 Hive安装步骤: 1.解压hive压缩包, tar -zxvf 压缩包,然后进入module目录 查看压缩的文件 ,并改名为hive 2. pwd查看当…

Paper | CenterPoint

CenterPoint paper 文章目录 CenterPoint paper摘要IntroductionRelated WorkCenterPointTwo-Stage CenterPoint Reference 论文链接&#xff1a;https://arxiv.org/pdf/2006.11275.pdf 代码链接&#xff1a;https://github.com/tianweiy/CenterPoint 摘要 该文章是Center-ba…

SpringBoot--日志

日志的作用&#xff1f; 记录用户登陆日志&#xff0c;方便分析用户是正常登陆还是恶意破解用户记录系统的操作日志&#xff0c;方便数据恢复和定位操作人记录程序的执行时间&#xff0c;方便为以后优化程序提供数据支持 日志是程序的重要组成部分&#xff0c;最重要的用途是…

Leetcode | 40 组合总和II

40 组合总和II 文章目录 40 组合总和II题目官方解法&#xff1a;回溯思路与算法 codeReference 题目 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能…

【哈佛积极心理学笔记】第12讲 写日记

第12讲 写日记 preparationincubation (take a break, need some rest time)evaluationelaboration JP Morgan’s quote, I can do a year’s work in 9 months but not in 12" a simple technique of intervation: journaling Postive emotions and painful emotions…

CSS基础学习--12 分组 和 嵌套 选择器

一、分组选择器 在样式表中有很多具有相同样式的元素 h1 {color:green; } h2 {color:green; } p {color:green; } 为了尽量减少代码&#xff0c;你可以使用分组选择器。 每个选择器用逗号分隔。 在下面的例子中&#xff0c;我们对以上代码使用分组选择器&#xff1a; <!DO…