基于OpenCV的网络实时视频流传输

2023-05-16

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头。但是有时,大家又希望能够随时随地观看视频直播。

大多数人会选择使用IP摄像机(Internet协议摄像机)而不是CCTV(闭路电视),因为它们具有更高的分辨率并降低了布线成本。在本文中,我们将重点介绍IP摄像机。IP摄像机是一种数字 摄像机,可以通过IP网络接收控制数据并发送图像数据,并且不需要本地记录设备。大多数IP摄像机都是基于RTSP(实时流协议)的,因此Internet浏览器本身“不支持”它

01.如何使用Web浏览器查看实时流媒体

计算机视觉是一个跨学科领域,涉及如何制作计算机以从数字图像或视频获得高层次的理解。为了实现计算机视觉部分,我们将使用Python中的OpenCV模块,并在Web浏览器中显示实时流,我们将使用Flask Web框架。在进入编码部分之前,让我们首先简要地了解这些模块。如果您已经熟悉这些模块,则可以直接跳到下一部分。

根据Wikipedia的说法,Flask是用Python编写的微型Web框架。它被归类为微框架,因为它不需要特定的工具或库。它没有数据库抽象层,表单验证或任何其他现有的第三方库提供公用功能的组件。

根据GeeksForGeeks的说法,OpenCV是用于计算机视觉,机器学习和图像处理的巨大开放源代码库,现在它在实时操作中起着重要作用,这在当今的系统中非常重要。

02.操作步骤

第1步-安装Flask和OpenCV:

可以使用“ pip install flask”和“ pip install opencv-python ”命令。我使用PyCharm IDE开发flask应用程序。

第2步-导入必要的库,初始化flask应用程序:

现在,我们将导入必要的库并初始化我们的flask应用程序。

#Import necessary libraries
from flask import Flask, render_template, Response
import cv2
#Initialize the Flask app
app = Flask(__name__)

第3步-使用OpenCV捕获视频:

创建一个VideoCapture()对象以触发相机并读取视频的第一个图像/帧。我们可以提供视频文件的路径,也可以使用数字来指定本地网络摄像头的使用。要触发网络摄像头,我们将“ 0”作为参数传递。为了从IP摄像机捕获实时源,我们提供RTSP链接作为参数。

camera = cv2.VideoCapture(0)
'''
for ip camera use - rtsp://username:password@ip_address:554/user=username_password='password'_channel=channel_number_stream=0.sdp' 
for local webcam use cv2.VideoCapture(0)
'''

第4步-添加窗口并从相机生成帧:

gen_frames()函数进入一个循环,在该循环中,它不断从相机返回帧作为响应块。该函数要求摄像机提供一个帧,然后将其格式化为内容类型为的响应块,并使其屈服image/jpeg,如上所示。代码如下所示:

def gen_frames():  
    while True:
        success, frame = camera.read()  # read the camera frame
        if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')  # concat frame one by one and show result


第5步-为网络应用的默认页面定义应用路由

路由指的是应用程序的URL模式(例如myapp.com/home或myapp.com/about)。@app.route("/")是Flask提供的Python装饰器,用于在我们的应用中分配URL以便轻松运行。

@app.route('/')
def index():
    return render_template('index.html')

装饰器告诉我们@app,只要用户访问给定的应用程序域(本地服务器的localhost:5000).route(),就执行该index()功能。Flask使用Jinja模板库渲染模板。在我们的应用程序中,我们将使用模板来呈现HTML,这些HTML将显示在浏览器中。

第6步-定义视频供稿的应用路由:

@app.route('/video_feed')
def video_feed():
    return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')

“ / video_feed”路由返回流式响应。由于此流返回要在网页中显示的图像,因此路由的URL在image标记的“ src”属性中(请参见下面的“ index.html”)。浏览器将通过在其中显示JPEG图像流来自动更新图像元素,因为大多数/所有浏览器都支持多部分响应

让我们看一下我们的index.html文件:

<body>
<div class="container">
    <div class="row">
        <div class="col-lg-8  offset-lg-2">
            <h3 class="mt-5">Live Streaming</h3>
            <img src="{{ url_for('video_feed') }}" width="100%">
        </div>
    </div>
</div>
</body>

第7步-启动Flask服务器

if __name__ == "__main__":
    app.run(debug=True)

调用app.run()并将Web应用程序本地托管在[localhost:5000]上。

“ debug = True”可确保我们不需要在每次进行更改时都运行应用程序,只需在服务器仍在运行时刷新网页即可查看更改。

项目结构:

该项目保存在名为“摄像机检测”的文件夹中。我们运行“ app.py”文件。运行此文件后,我们的应用程序将托管在本地服务器的端口5000上。

  • 只需在运行“ app.py”后在网络浏览器中键入“ localhost:5000”即可打开您的网络应用程序

  • app.py —这是我们在上面创建的Flask应用程序

  • 模板-此文件夹包含我们的“ index.html”文件。在渲染模板时,这在Flask中是必需的。所有HTML文件都放在此文件夹下。

让我们看看当我们运行'app.py'时会发生什么:

在单击提供的URL时,我们的Web浏览器将打开实时供稿。由于我使用了上面的VideoCapture(0),因此网络摄像头摘要会显示在浏览器中:

中有来自IP摄像机/网络摄像机的实时视频流,可用于安全和监视目的。

代码链接:https://github.com/NakulLakhotia/Live-Streaming-using-OpenCV-Flask

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于OpenCV的网络实时视频流传输 的相关文章

  • Ubuntu20安装ROS noetic

    Ubuntu20对应的ROS版本为ROS noetic xff0c 安装过程如下 xff1a 1 打开Software amp Updates xff0c 勾选main universe restricted multiverse这四项 2
  • 使用VSCode进行远程C++开发

    本文以Windows连接Ubuntu子系统 WSL 为例来介绍VSCode的远程开发流程 首先在VSCode中安装Remote WSL插件 xff0c 重启VSCode xff0c 如下图所示 xff0c 连接WSL 如果是其他远程 xff
  • ROS话题发布和订阅节点的C++&Python实现

    本文将分别使用C 43 43 和Python来实现话题发布者和订阅者 xff0c 首先创建一个功能包 xff0c 命名为topic pub sub xff0c 添加roscpp xff0c rospy等依赖项 C 43 43 实现 创建话题
  • 只要活着,我愿意一辈子都做程序员

    前不久 xff0c 我看过一个有意思的帖子 xff0c 标题是 35岁是程序员的终点 作者列举了35岁的年龄已经不适合继续做程序员的种种原因 xff0c 试图说服在这个年龄段的程序员做出改变 xff0c 初一看 xff0c 我自己也觉得很有
  • 机器人自主导航 | ROS与移动底盘通信

    本实验是实现机器人自主导航的重要步骤 xff0c 对于轮式机器人 xff0c 可以通过在底盘加装轮式里程计的方式来获得机器人的速度数据 xff0c 这些数据可以用来辅助机器人实现自主定位 xff0c 同时机器人还需要将控制指令发送给移动底盘
  • 使用C++调用Python模块(Linux)

    使用Python调用C 43 43 库见 xff1a 我的另一篇博客 工程配置 本文使用的项目构建工具为CMake xff0c 使用FindPython工具在CMake工程中找到Python库 xff0c 注意CMake最低版本为3 12
  • ROS开机自启设置

    使用robot upstart功能包即可实现节点的开机自启 安装功能包 安装robot upstart功能包 xff0c 本文使用的Ubuntu20对应的ROS版本为noetic span class token function sudo
  • 信号处理 | 维纳滤波推导

    首先给出互相关函数定义 xff1a r s x m
  • 信号处理 | AR模型与Levinson-Durbin递推

    模型形式 由高斯白噪声驱动的全极点模型表示如下 xff1a e n
  • 使用Python调用C++库(基于pybind11)

    本文将用C 43 43 编写一个简单的向量运算库 xff0c 然后使用pybind11将其封装为python包 xff0c 再使用python调用 C 43 43 程序使用CMake构建 使用C 43 43 调用Python模块见 xff1
  • FTP实现Ubuntu与Windows文件互传

    FTP实现window与ubuntu文件互传 本文将介绍如何使用FTP实现Ubuntu和Windows间的文件互传 xff0c 基本方法是在Ubuntu主机上安装FTP服务端 xff0c 在其他设备 Windows 上安装FTP客户端 以下
  • KD-Tree详解: 从原理到编程实现

    C 43 43 实现链接 https gitee com ghowoght kd tree 在点云操作中 xff0c 常常需要从大量点云中找到距离输入点最近的点 xff0c 如果使用线性搜索 xff0c 逐个判断与输入点的距离 xff0c
  • FRP + NoMachine远程桌面开发指南

    在FRP内网穿透 远程ssh终端 43 rdp桌面配置 中介绍了如何远程使用FRP 43 RDP进行外网远程桌面访问 xff0c 但是实测很卡 在两台Ubuntu主机上进行了测试 xff0c 云服务器有8M带宽 xff0c 所以对这种远程桌
  • 升级!!!运用select实现一个简单的TCP通信!

    升级 xff01 xff01 xff01 运用select实现一个简单的TCP通信 多路转接模型select模型select模型的操作流程简介 TCP的实现封装一个TCP服务端封装一个select类main程序 多路转接模型 多路转接IO
  • 嵌入式部分BUG与解决方法记录(不定期更新)

    关闭串口缓存 在使用422转USB数据线采集IMU数据时 xff0c 上位机的USB驱动程序会对接收到的数据进行缓存 xff0c 表现在于IMU使用200Hz的频率发送IMU数据 xff0c 而采集到的IMU数据的时间戳间隔并不是5ms x
  • Windows的C++开发环境搭建(基于vcpkg+CMake)

    一直以来 xff0c 笔者都认为在windows中使用cmake开发C 43 43 是一件很难搞的事 xff0c windows不像linux那样能方便地对各种C 43 43 软件包进行管理 xff0c 直到发现了vcpkg这个包管理器 x
  • C++/Python文件读写

    C 43 43 为了方便开发 xff0c 写了一个文本读写程序 xff0c 能够读写二进制 文本格式的文件 xff0c 程序只由一个头文件组成 xff0c 可以很方便地加入到现有程序 完整程序如下 xff1a span class toke
  • 遥控小车日志

    上周六 xff0c 我的老师扔给我一台四轮普通直流电机小车 xff08 下图 xff0c 已组装好 xff09 xff0c 叫我实现无线控制功能 xff0c 由PC端或手机端发送指令 由于我曾经做过步进电机小车的控制 xff0c 同时最近学
  • 数值优化学习笔记(一)C++实现线性搜索的最速下降法(以Rosenbrock函数为例)

    Rosenbrock函数介绍 Rosenbrock是可导非凸函数 xff0c 二维情况下的函数值情况如下 xff1a 高维函数定义如下 xff1a f x 61
  • 软中断-小结

    1 软中断类型是静态定义的 xff0c 10种 2 软中断回调函数是在本地CPU开中断的情况下执行 因此能够被中断打断 xff0c 但是软中断无法抢占软中断 因为在irq exit的时候会判断是否在中断上下文 xff0c 如果在中断上下文不

随机推荐

  • slam中ceres的用法解析

    slam中ceres的常见用法总结 1 ceres 使用流程2 ICP实例2 1 优化状态参数化2 2 jacobian矩阵的求解 1 ceres 使用流程 ceres的使用过程基本可以总结为 1 创建优化问题与损失核函数 ceres Pr
  • Kalibr进行IMU+相机的标定

    环境 xff1a Ubuntu18 04 Kalibr代码连接 xff1a https github com ethz asl kalibr 1 安装依赖 ROSsudo apt get install python setuptools
  • Docker容器之镜像仓库详解

    Docker容器之镜像仓库详解 文章目录 Docker容器之镜像仓库详解1 什么是Docker Image xff1f 2 什么是Docker Registry 3 镜像相关的操作 本文将集中对镜像 仓库 容器的概念与三者之间的联系进行详细
  • Linux 中 rc.local、init.d、rc.x、init 这几个文件(夹)各有什么作用?启动执行的脚本应该均放在 rc.local 中吗?

    Linux 中 rc local init d rc x init 这几个文件 夹 各有什么作用 启动执行的脚本应该均放在 rc local 中吗 参考链接 1 https www zhihu com question 20126189 2
  • PX4 Offboard模式调试指南

    下载QGroundcontrol https docs qgroundcontrol com master en getting started quick start html 飞控初始化配置 按PX4基本配置指南走 https docs
  • PX4 PID调试指南

    PX4基本配置参考 xff1a https blog csdn net qq 42703283 article details 115214729 spm 61 1001 2014 3001 5501 本文仅供参考 xff0c 如有困惑的参
  • ROS:OpenCV的常用头文件解释

    1 include lt cv bridge cv bridge h gt include lt cv bridge cv bridge h gt cv bridge类 xff1a 这个类中提供的API主要功能是将图像从sensor msg
  • STM32介绍

    STM32 是意法半导体推出的 32 位 ARM Cortex M 内核微控制器系列 xff0c 具有高性能 低功耗 可靠性强等特点 xff0c 广泛应用于工业控制 智能家居 汽车电子 医疗设备等领域 本文将详细介绍 STM32 系列的特点
  • Ubuntu 18.04文件下载

    ubuntu sim ros melodic sh 链接 link 下面为打开后的具体情况 span class token comment span span class token operator span span class to
  • ubuntu18.04下QGC安装

    QGC安装 xff08 新手操作 xff09 参考官网教程即可 官网链接 link 先把命令行的代码贴过来 xff0c 方便大家复制粘贴 第 span class token number 1 span 步的 sudo usermod sp
  • PX4 ulg文件格式转化(windows下)

    福利领取 在经过多次尝试ubuntu下安装pyulog失败后 xff0c 多次失败 xff0c 查找相关资料 xff0c 发现是python相关包出现了问题 xff0c 最后发现了anaconda这个好东西 xff0c 包含了python下
  • PX4固定翼姿态控制器详细介绍(一)

    代码版本1 8 2 源码地址 Firmware1 8 2 一 前言 最近需要做一下固定翼的相关姿态控制 xff0c 只对控制流程进行简单介绍 xff0c 特此记录下相关流程 xff0c 方便自己后续进一步调试 xff0c 以下对PX4固定翼
  • Github仓库命名规范

    Github仓库命名规范 命名规则 GIT库名一律采用项目名 类型 年月的形式 其中对项目名的规范如下 xff1a 库名中不得出现下述规定的字符 64 amp 39 39 xff0c lt gt 库名应尽量避免使用 名 名的形式 库名应尽量
  • CVTE嵌入式面经

    2021提前批嵌入式实习 CVTE笔试 xff1a 大约20个选择题和两道手撕代码题 选择题主要是问LINUX一些指令和一些单片机的相关知识 比如中断任务里面该写什么代码之类的 CVTE一面 xff1a 大约半个小时 1 自我介绍 2 谈谈
  • 97条架构师必须掌握的知识

    1 Don 39 t put your resume ahead ofthe requirements by Nitin Borwankar 需求先于履历 身为架构 师要平衡客户 公司和个人的利益 用时兴的技术 为个人履历增光添彩固然重要
  • 以Crotex M3为例讲解stm32芯片内部原理

    一款STM32F103ZET6是72Mhz 64kRAM 512kROM为例进行简要分析其MCU工作原理 1 分清几个概念 1 1RAM可读写静态储存器 平常所说的DDR就是RAM的一种 用于CPU直接交换数据 1 2ROM只可读静态存储器
  • 内外网共用操作

    1 首先将内网 外网的两根网线接入交换机 xff0c 再从交换机出来一根线接入你的电脑 xff08 如果是路由器的话 xff0c 内网 外网的网线接入LAN口 xff0c 再从LAN口出来一根线接入你的电脑 xff09 2 打开IP设置 x
  • 【从零学习OpenCV 4】了解OpenCV的模块架构

    本文首发于 小白学视觉 微信公众号 xff0c 欢迎关注公众号 本文作者为小白 xff0c 版权归人民邮电出版社所有 xff0c 禁止转载 xff0c 侵权必究 xff01 经过几个月的努力 xff0c 小白终于完成了市面上第一本OpenC
  • 对象检测和图像分割有什么区别?

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 01 人工智能中的图像预处理 对象检测和图像分割是计算机视觉的两种方法 xff0c 这两种处理手段在人工智能领域内相当常见 xff0c
  • 基于OpenCV的网络实时视频流传输

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头 但是有时 xff0c 大家又希望能够随时随地观看视频直播 大多数人会选择使