1. 程式人生 > 程式設計 >基於OpenCV的網路實時視訊流傳輸的實現

基於OpenCV的網路實時視訊流傳輸的實現

很多小夥伴都不會在家裡或者辦公室安裝網路攝像頭或監視攝像頭。但是有時,大家又希望能夠隨時隨地觀看視訊直播。

大多數人會選擇使用IP攝像機(Internet協議攝像機)而不是CCTV(閉路電視),因為它們具有更高的解析度並降低了佈線成本。在本文中,我們將重點介紹IP攝像機。IP攝像機是一種數字攝像機,可以通過IP網路接收控制資料併發送影象資料,並且不需要本地記錄裝置。大多數IP攝像機都是基於RTSP(實時流協議)的,因此Internet瀏覽器本身“不支援”它

基於OpenCV的網路實時視訊流傳輸的實現

01.如何使用Web瀏覽器檢視實時流媒體

計算機視覺是一個跨學科領域,涉及如何製作計算機以從數字影象或視訊獲得高層次的理解。為了實現計算機視覺部分,我們將使用Python中的OpenCV

模組,並在Web瀏覽器中顯示實時流,我們將使用FlaskWeb框架。在進入編碼部分之前,讓我們首先簡要地瞭解這些模組。如果您已經熟悉這些模組,則可以直接跳到下一部分。

根據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 實時視訊流傳輸內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!