了解 MJPEG 影像串流的結構之後,就能透過 Flask 搭配 OpenCV,建立可以即時傳輸串流影像的簡單網頁,首先安裝 Flask 和 OpenCV。
pip install flask, opencv-python
使用下方的程式碼,使用 Flask 建立一個簡單的網頁,當網頁開啟後,裡面會放入一張路徑為「/mjpeg
」的圖片,讀取圖片時,會發送另外一個 http request 執行 mjpeg 函式,函式內容根據上述的「多部分回應 Multipart Responses」結構,發送 MJPEG 的內容。
from flask import Flask, Response
import cv2, time
app = Flask(__name__)
def gen_frames():
cap = cv2.VideoCapture(0) # 開啟鏡頭
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) # 設定影像寬度 320
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) # 設定影像高度 240
while True:
ret, frame = cap.read() # 讀取影像
if not ret:
break
else:
jpg = cv2.imencode('.jpg', frame)[1] # 轉換成 jpg 陣列
mjpeg = jpg.tobytes() # 轉換成傳輸 bytes
# 使用 generator 的方式,每次傳輸特定每個部分
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + mjpeg + b'\r\n')
@app.route('/mjpeg')
def mjpeg():
# 回傳 Multipart Responses
return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')
@app.route('/')
def index():
return '''<h1>OXXO.STUDIO 影像串流</h1>
<img src="/mjpeg">'''
if __name__ == '__main__':
app.run("127.0.0.1", port=5000, threaded=True)
因此當網頁開啟後,網頁中所載入的就會自動根據 MJPEG 發送對應的串流,不斷顯示每個部分的影像。
在網頁上點擊右鍵查看網頁原始碼,可以看出顯示串流的 HTML 為一個 img 標籤。