Plotly da sh - Динамическое отображение изображения ndarray - PullRequest
0 голосов
/ 30 января 2020

Контекст : я пытаюсь создать простое приложение для обработки изображений, используя Plotly Da sh. Он должен иметь возможность отображать изображения и выполнять некоторые операции с изображением при обновлении отображения изображения. Изображение будет сгенерировано на лету или загружено в приложение.

Изображения имеют формат numpy ndarray, поскольку моя обработка основана на операциях numpy и matplotlib, использующих такой формат.

Вопрос: Что такое код Python, который позволяет отображать ndarray при возможности его обновления с помощью какой-либо операции GUI?

Я в основном ищу ближайшую вещь, которую да sh может предложить matplotlib.pyplot.imshow()

Исследование: В своем исследовании я нашел этот репозиторий которые, вероятно, включают в себя все основные c функции, которые мне нужны, чтобы начать работать, но как новичок в Plotly Da sh я изо всех сил пытаюсь извлечь нужный мне код, и, похоже, он также не использует numpy.

Я нашел этот вопрос , что очень близко к тому, что я спрашиваю, но единственный ответ не включает numpy массивов.

1 Ответ

0 голосов
/ 03 февраля 2020

Я нашел решение с 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)

Результат:

On the browser, the strips slowly move

В браузере, полосы медленно движутся, я думаю, что GIF-файл будет лучше.

Старайтесь не посылать слишком много изображений в секунду, иначе вы переполните приложение и браузер, и они в конечном итоге получат sh. Так что используйте time.pause или другой эквивалентный ограничитель в генераторе l oop.

Да, я все еще заинтересован в том, как другие люди будут это делать. Одним из недостатков этого решения является то, что я думаю, что пользователям придется использовать один и тот же дисплей, определенный по пути /video_feed.

...