2017-03-13 26 views
1

1秒に何回も更新するウィンドウにjpgを表示したい。 私は100行のコード(画像を作成するニューラルネットワーク)を使って非常にコンパクトなプログラムをコーディングしており、画像を表示するために別の100行のコードを入れたくありません。 この問題を解決するためにできることはありますか?(Python)1つのウィンドウに更新画像を表示する

多くのTHX、JJ

+0

100行だけを書き、それで済むようにしてください。だから彼らはモジュールを発明したのです。 –

+0

OpenCVライブラリを見て、ウィンドウ内のjpgを非常に高速に更新できます。 –

+0

@ MarkRansomいいえコードを短くしたいです。 – jackjuni

答えて

2

それはIOが問題ではないことをコメントで述べたように、それはのためのデファクト標準プロットライブラリであるため、我々は、matplotlibで使用可能な標準のイメージプロットツールに直行するものとはPython。ニューラルネットワークに由来する典型的な画像の寸法を知らないうちに、電話にかけるまでの平均時間を簡単に比較する。 imshow,pcolormeshおよびmatshowは、画像の大きさが異なると痛いことがありません(pcolorはかなり遅いため省略されています)。だから、

enter image description here

import matplotlib.pyplot as plt 
import numpy as np 
import timeit 

n = 13 
repeats = 20 
timetable = np.zeros((4, n-1)) 
labellist = ['imshow', 'matshow', 'pcolormesh'] 

for i in range(1, n): 
    image = np.random.rand(2**i, 2**i) 
    print('image size:', 2**i) 
    timetable[0, i - 1] = 2**i 

    timetable[1, i - 1] = timeit.timeit("plt.imshow(image)", setup="from __main__ import plt, image", number=repeats)/repeats 
    plt.close('all') 
    timetable[2, i - 1] = timeit.timeit("plt.matshow(image)", setup="from __main__ import plt, image", number=repeats)/repeats 
    plt.close('all') 
    timetable[3, i - 1] = timeit.timeit("plt.pcolormesh(image)", setup="from __main__ import plt, image", number=repeats)/repeats 
    plt.close('all') 

for i in range(1, 4): 
    plt.semilogy(timetable[0, :], timetable[i, :], label=labellist[i - 1]) 
    plt.legend() 
    plt.xlabel('image size') 
    plt.ylabel('avg. exec. time [s]') 
    plt.ylim(1e-3, 1) 

plt.show() 

imshowことがあります。 matplotlibのプロットを更新またはアニメーション化するエレガントな方法は、それが提供するアニメーションフレームワークです。そうすれば、要求されたように、多くのコード行を気にする必要はありません。ここでは簡単な例を示します。

import matplotlib.pyplot as plt 
import numpy as np 
import time 
from matplotlib import animation 

data = np.random.rand(128, 128) 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 

im = ax.imshow(data, animated=True) 

def update_image(i): 
    data = np.random.rand(128, 128) 
    im.set_array(data) 
    # time.sleep(.5) 
    # plt.pause(0.5) 
ani = animation.FuncAnimation(fig, update_image, interval=0) 

plt.show() 

この例では、ニューラルネットワークは更新機能から呼び出されます。計算量の多い作業での更新動作は、time.sleepでエミュレートできます。あなたのアプリケーションがマルチスレッドの場合plt.pause他のスレッドに自分の作業を行う時間を与えるのに便利かもしれません。 interval=0は基本的に可能な限り頻繁にプロットの更新を行います。

これはあなたが一般的な方向であなたを指しており、役立つことを願っています。アニメーションを使用したくない場合は、キャンバスのクリアリングやブリッティングを手作業で行う必要があります。

関連する問題