基于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 相关文章推荐
python线程锁(thread)学习示例
Dec 04 Python
python求众数问题实例
Sep 26 Python
Python使用当前时间、随机数产生一个唯一数字的方法
Sep 18 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
python基于pdfminer库提取pdf文字代码实例
Aug 15 Python
用Python批量把文件复制到另一个文件夹的实现方法
Aug 16 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
Apr 07 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 Python
Python实现Word文档转换Markdown的示例
Dec 22 Python
pycharm Tab键设置成4个空格的操作
Feb 26 Python
Elasticsearch 批量操作
Apr 19 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学习之 循环结构实现代码
2011/06/09 PHP
PHP反向代理类代码
2014/08/15 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
QUnit jQuery的TDD框架
2010/11/04 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
JS+CSS实现电子商务网站导航模板效果代码
2015/09/10 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
python 中文乱码问题深入分析
2011/03/13 Python
Python正则捕获操作示例
2017/08/19 Python
Python RabbitMQ消息队列实现rpc
2018/05/30 Python
Python可迭代对象操作示例
2019/05/07 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
毕业自我评价范文
2013/11/17 职场文书
致铅球运动员广播稿精选
2014/01/12 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
烟台的海导游词
2015/02/02 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技