您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關使用OpenCV如何實現網絡實時視頻流傳輸,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
大多數人會選擇使用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"> <h4 class="mt-5">Live Streaming</h4> <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'時會發生什么:
在單擊提供的URL時,我們的Web瀏覽器將打開實時供稿。由于我使用了上面的VideoCapture(0),因此網絡攝像頭摘要會顯示在瀏覽器中:
中有來自IP攝像機/網絡攝像機的實時視頻流,可用于安全和監視目的。
關于使用OpenCV如何實現網絡實時視頻流傳輸就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。