2017-02-20 35 views
0

以下是我的代碼。它是一個從客戶端接收位圖流的服務器程序,我希望實時顯示位圖。然而,「frame.set_data(im)」是我的代碼的瓶頸,我只得到5 FPS。禁用該行,我得到接收圖像15fps。 (如果沒有set_data(),顯示將被禁用)。用matplotlib和set_data()顯示實時位圖太慢。如何使用位圖執行位圖操作?

我查找了其他答案,並且我知道我必須使用MatPlotLib執行blitting來加快速度。但是,我不知道如何使用位圖執行blitting。有人能幫我快速解決問題嗎?

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

最終速度肯定取決於圖像的大小。使用'set_data'提供數據以imshow確實需要一些時間,所以幀率下降並不奇怪。 Blitting可能有所幫助。現在我不知道你的應用程序是否允許使用'matplotlib.animation.FuncAnimation'?如果是這樣,可以直接使用'blit = True'。如果沒有,看看[這個問題](http://stackoverflow.com/questions/40126176/fast-live-plotting-in-matplotlib-pyplot)如何使用blitting沒有內置的動畫類。 – 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