1秒に何回も更新するウィンドウにjpgを表示したい。 私は100行のコード(画像を作成するニューラルネットワーク)を使って非常にコンパクトなプログラムをコーディングしており、画像を表示するために別の100行のコードを入れたくありません。 この問題を解決するためにできることはありますか?(Python)1つのウィンドウに更新画像を表示する
多くのTHX、JJ
1秒に何回も更新するウィンドウにjpgを表示したい。 私は100行のコード(画像を作成するニューラルネットワーク)を使って非常にコンパクトなプログラムをコーディングしており、画像を表示するために別の100行のコードを入れたくありません。 この問題を解決するためにできることはありますか?(Python)1つのウィンドウに更新画像を表示する
多くのTHX、JJ
それはIOが問題ではないことをコメントで述べたように、それはのためのデファクト標準プロットライブラリであるため、我々は、matplotlib
で使用可能な標準のイメージプロットツールに直行するものとはPython。ニューラルネットワークに由来する典型的な画像の寸法を知らないうちに、電話にかけるまでの平均時間を簡単に比較する。 imshow
,pcolormesh
およびmatshow
は、画像の大きさが異なると痛いことがありません(pcolorはかなり遅いため省略されています)。だから、
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
は基本的に可能な限り頻繁にプロットの更新を行います。
これはあなたが一般的な方向であなたを指しており、役立つことを願っています。アニメーションを使用したくない場合は、キャンバスのクリアリングやブリッティングを手作業で行う必要があります。
100行だけを書き、それで済むようにしてください。だから彼らはモジュールを発明したのです。 –
OpenCVライブラリを見て、ウィンドウ内のjpgを非常に高速に更新できます。 –
@ MarkRansomいいえコードを短くしたいです。 – jackjuni