2017-02-20 25 views
0

Ниже мой код. Это серверная программа, которая получает поток битмапов от клиента, и я хочу отображать растровое изображение в реальном времени. Однако «frame.set_data (im)» - это шея бутылки моего кода, и я получаю только 5 FPS. Отключив эту строку, я получаю 15 кадров в секунду для получения изображений. (отображение отключено без использования set_data()).Отображение растрового изображения в реальном времени с помощью matplotlib и set_data() выполняется слишком медленно. Как выполнить биение с растровыми изображениями?

Я искал другие ответы, и я знаю, что должен выполнять блиты, чтобы ускорить работу с MatPlotLib. Тем не менее, я понятия не имею, как выполнять блиты с растровыми изображениями. Может ли кто-нибудь помочь мне быстро разобраться?

import matplotlib 
matplotlib.use('TKAgg') 
import matplotlib.pyplot as plt 

while 1: 
    # Decode and Save Image 
    imgdata = base64.b64decode(data) 
    stream = io.BytesIO(imgdata) 

    # Display realtime gameplay 
    im = plt.imread(stream,"bmp") 
    if frame is None: 
     print "Start Rendering.." 
     frame = plt.imshow(im) 
     plt.show() 
    else: 
     frame.set_data(im) 
    plt.pause(0.00000001) 
+0

Кто-то может доказать, что я ошибаюсь, но я бы сказал, что matplotlib не подходит для этой задачи. Он больше ориентирован на качество, чем на производительность. Конечно, есть и другие библиотеки, которые могут показывать изображения намного быстрее (например, [pygame] (http://stackoverflow.com/q/8873219/3005167)). – kazemakase

+0

Конечная скорость, безусловно, будет зависеть от того, насколько велики изображения. Предоставление данных для imshow с использованием 'set_data' занимает некоторое время, поэтому неудивительно, что частота кадров падает. Блиты могут помочь. Теперь я не знаю, сможет ли ваше приложение использовать 'matplotlib.animation.FuncAnimation'? Если это так, 'blit = True' можно напрямую использовать. Если нет, посмотрите [этот вопрос] (http://stackoverflow.com/questions/40126176/fast-live-plotting-in-matplotlib-pyplot) о том, как использовать блинттинг без встроенного класса анимации. – ImportanceOfBeingErnest

ответ

0

Благодаря @kazemakase я смог достичь желаемой скорости с Pygame. Ниже мой код.

import pygame 

pygame.init() 
screen = pygame.display.set_mode(size) 

while 1: 
    # Decode and Save Image 
    imgdata = base64.b64decode(data) 
    stream = io.BytesIO(imgdata) 

    pygame.event.get() 
    img=pygame.image.load(stream,'bmp') 
    screen.blit(img,(0,0)) 
    pygame.display.flip() # update the display