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


Posted in Python onNovember 15, 2020

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

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

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

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步-添加窗口并从相机生成帧:

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

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”可确保我们不需要在每次进行更改时都运行应用程序,只需在服务器仍在运行时刷新网页即可查看更改。

项目结构:

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

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

  • 只需在运行“ app.py”后在网络浏览器中键入“ localhost:5000”即可打开您的网络应用程序
  • app.py —这是我们在上面创建的Flask应用程序
  • 模板-此文件夹包含我们的“ index.html”文件。在渲染模板时,这在Flask中是必需的。所有HTML文件都放在此文件夹下。

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

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

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

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

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

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

到此这篇关于基于OpenCV的网络实时视频流传输的实现的文章就介绍到这了,更多相关OpenCV 实时视频流传输内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用C++封装MySQL的API的教程
May 06 Python
python生成带有表格的图片实例
Feb 03 Python
对python中if语句的真假判断实例详解
Feb 18 Python
2019 Python最新面试题及答案16道题
Apr 11 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
用Python做一个久坐提醒小助手的示例代码
Feb 10 Python
python调用API接口实现登陆短信验证
May 10 Python
Python接口测试文件上传实例解析
May 22 Python
Keras 加载已经训练好的模型进行预测操作
Jun 17 Python
python字典的值可以修改吗
Jun 29 Python
2021年最新用于图像处理的Python库总结
Jun 15 Python
Python 实现Mac 屏幕截图详解
Oct 05 Python
彻底解决Python包下载慢问题
Nov 15 #Python
Python eval函数原理及用法解析
Nov 14 #Python
Django怎么在admin后台注册数据库表
Nov 14 #Python
通过实例解析python and和or使用方法
Nov 14 #Python
Python高并发和多线程有什么关系
Nov 14 #Python
Django跨域请求原理及实现代码
Nov 14 #Python
Pycharm如何自动生成头文件注释
Nov 14 #Python
You might like
PHP中如何调用webservice的实例参考
2013/04/25 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
扩展String功能方法
2006/09/22 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
js控制页面控件隐藏显示的两种方法介绍
2013/10/09 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
2015/03/03 Javascript
js实现仿Discuz文本框弹出层效果
2015/08/13 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
Bootstrap中CSS的使用方法
2016/02/17 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
javascript滚轮事件基础实例讲解(37)
2017/02/14 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
2017/07/17 jQuery
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
python使用TensorFlow进行图像处理的方法
2018/02/28 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
python创造虚拟环境方法总结
2019/03/04 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
保护地球的标语
2014/06/17 职场文书
高中校园广播稿
2014/10/21 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
求职简历自我评价范文
2015/03/10 职场文书
工厂仓库管理员岗位职责
2015/04/09 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技