现在我们常常在家里、办公室或其它地方安装网络摄像头或监控摄像头来进行视频监控。
大多数人使用IP摄像机(互联网协议摄像机)而不是闭路电视(闭路电视),这是因为它们具有更高的分辨率和更低的布线成本。你可以在这里找到这两种系统之间的详细差异。在本文中,我们将重点介绍IP摄像机:https://www.taylored.com/blog/cctv-vs-ip-cameras-which-is-best-suited-for-your-business/
IP摄像机是一种数字摄像机,它通过IP网络接收控制数据并发送图像数据,无需本地记录设备。大多数IP摄像机是基于RTSP(实时流协议)的,因此在internet浏览器中“不受支持”。
使用网络浏览器来进行实时视频流显示
计算机视觉是一个跨学科的领域,研究如何使计算机从数字图像或视频中获得高层次的理解。
为了实现计算机视觉的相关技术,我们使用Python中的OpenCV模块,并使用flask web框架在web浏览器中显示实时流。在进入编码部分之前,让我们先简单地了解一下这些模块,如果你已经熟悉这些模块,可以直接跳到下一节。
根据维基百科的说法,Flask是一个用Python编写的微型web框架,它被归类为微框架,因为它不需要特定的工具或库,同时它没有数据库抽象层、表单验证或任何其他组件,其中已有的第三方库提供了通用功能。
根据GeeksForGeeks的说法,OpenCV是用于计算机视觉、机器学习和图像处理的大型开源库,现在它在实时操作中扮演着重要的角色,这在当今的系统中非常重要。
步骤1-安装Flask&OpenCV:
我们可以使用'pip install flask'和'pip install opencv python'命令来进行安装。如果想在PyCharm中安装,请执行以下步骤:https://www.jetbrains.com/help/pycharm/installing-uninstalling-and-upgrading-packages.html
步骤2-导入必要的库,初始化flask应用程序:
现在我们将导入必要的库并初始化flask应用程序。
# 导入必要的库
from flask import Flask, render_template, Response
import cv2
# 初始化Flask app
app = Flask(__name__)
步骤3-使用OpenCV捕获视频:
创建一个VideoCapture对象来触发摄像机并读取视频的第一个图像/帧,我们可以输入视频文件的路径,也可以使用数字指定本地网络摄像头。若要触发网络摄像头,我们将“0”作为参数传递。为了从IP摄像机捕获,我们提供RTSP链接作为参数。要查看IP摄像机的RTSP地址,请执行以下操作-查找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
步骤5-为web应用的默认页面定义应用程序路由:
路由是指应用程序的URL模式(例如myapp.com/home或者myapp.com/about)。@app.route("/")
是Flask提供的Python修饰符,它可以轻松地将应用程序中的url分配给函数。
@app.route('/')
def index():
return render_template('index.html')
注解@app.route,每当用户访问我们的应用程序域时(localhost:5000),执行index函数。Flask使用Jinja模板库来呈现模板。在我们的应用程序中,我们使用模板来呈现将在浏览器中显示的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”确保我们不需要每次进行更改时都运行我们的应用程序,我们只需在服务器仍在运行时刷新网页以查看更改。
项目结构:
项目保存在一个名为“摄像头检测”的文件夹中。我们运行'应用程序副本'文件,运行此文件时,我们的应用程序托管在本地服务器的端口5000。
运行app.py后在web浏览器上只需输入“localhost:5000“
- app.py-这是我们上面创建的Flask应用程序
- templates -此文件夹包含index.html'文件。在渲染模板时,这在Flask中是必需的,所有的HTML文件都放在这个文件夹下。
让我们看看运行app.py的时候会发生什么 :
在点击提供的网址,由于我使用了上面的VideoCapture(0),因此浏览器上会显示网络摄像头源:
你的网络浏览器上有来自IP摄像头/网络摄像头的实时视频流,可用于安全和监控目的。
请参阅我的GitHub代码:https://github.com/NakulLakhotia/Live-Streaming-using-OpenCV-Flask
希望这篇文章能让你对尝试计算机视觉领域的新事物感兴趣,并帮助你增加知识。
☆ END ☆