Я нашел решение с Flask.Response
и параметром src
html.Img
и openCV
для кодировки изображения:
import dash
import dash_core_components as dcc
import dash_html_components as html
import cv2
from flask import Flask, Response
import numpy as np
import time
def get_image(seed=0):
# strip slide
size = 400
res = np.mod((np.arange(size)[..., None] + np.arange(size)[None, ...]) + seed, [255])
ret, jpeg = cv2.imencode('.jpg', res)
return jpeg.tobytes()
def gen():
i = 0
while True:
time.sleep(0.03333)
frame = get_image(i)
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
i += 1
server = Flask(__name__)
app = dash.Dash(__name__, server=server)
@server.route('/video_feed')
def video_feed():
return Response(gen(),
mimetype='multipart/x-mixed-replace; boundary=frame')
app.layout = html.Div([
html.H1("Webcam Test"),
html.Img(src="/video_feed")
])
if __name__ == '__main__':
app.run_server(debug=True)
Результат:
В браузере, полосы медленно движутся, я думаю, что GIF-файл будет лучше.
Старайтесь не посылать слишком много изображений в секунду, иначе вы переполните приложение и браузер, и они в конечном итоге получат sh. Так что используйте time.pause
или другой эквивалентный ограничитель в генераторе l oop.
Да, я все еще заинтересован в том, как другие люди будут это делать. Одним из недостатков этого решения является то, что я думаю, что пользователям придется использовать один и тот же дисплей, определенный по пути /video_feed
.