やりたいこと
カメラ映像を画像処理した上でFlaskでストリーミングする方法をなんとか習得しました。
多くの解説サイトがそうであるように、出力画像が一つのものです。
では、複数の画像を同時にストリーミングさせるにはどうしたらよいのでしょうか。
カメラ映像そのままと画像処理された画像を流したいと考えています。
コード(画像ひとつ版)
Python
1from flask import Flask, render_template, Response 2import cv2 3 4app = Flask(__name__) 5 6class Camera(object): 7 def __init__(self): 8 self.video = cv2.VideoCapture(0) 9 10 def read(self): 11 return self.video.read() 12 13def gen(camera): 14 while True: 15 _, frame = camera.read() 16 17 # 画像処理1 グレースケールにする 18 image1 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 19 _, encoded1 = cv2.imencode('.jpg', image1) 20 bin1 = b"--frame\r\nContent-Type: image/jpeg\r\n\r\n" + encoded1.tobytes() + b"\r\n" 21 22 # 画像処理2 左右反転する 23 image2 = cv2.flip(frame, 1) 24 _, encoded2 = cv2.imencode('.jpg', image2) 25 bin2 = b"--frame\r\nContent-Type: image/jpeg\r\n\r\n" + encoded2.tobytes() + b"\r\n" 26 27 yield (bin1) 28 29@app.route("/") 30def stream(): 31 return render_template("stream.html") 32 33@app.route("/video1") 34def video1(): 35 return Response(gen(Camera()), 36 mimetype="multipart/x-mixed-replace; boundary=frame") 37 38if __name__ == "__main__": 39 app.run(debug=True)
html
1<html> 2<body> 3<img src="{{ url_for('video1') }}"> 4</body> 5</html>
やってみたこと
その1
2個の画像を出力させる一歩前の段階として、
gen(camera)
でbin1
でなくリスト[bin1, bin2]
を生成する- レスポンスを返すところで
gen(Camera())
でなくgen(Camera())[0]
を指定する
をやってみた → generator' object is not subscriptable エラー
その2
- その1と同じく
gen(camera)
でリスト[bin1, bin2]
を生成する - レスポンスを返すところで
list(gen(Camera()))[0]
を指定する
をやってみた → 何の反応もなし
と、複数表示させるどころか二つのバイナリを作ってそのうち一つを扱うことすらできていない状態です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/24 15:01
2022/05/25 00:55
2022/05/25 12:13