在一个窗口中显示更新的图像

5
我希望在一个窗口中显示一个jpg图片,该图片每秒更新多次。 我编写了一个非常紧凑的程序,只有100行代码(一个神经网络用于创建图像),不想再添加100行代码来显示图像。 有什么方法可以解决这个问题吗?
谢谢,jj

只要写100行代码就好了,这就是为什么他们发明模块的原因。 - Mark Ransom
看看OpenCV库,它可以非常快速地在窗口中更新jpg。 - Martin Evans
1
@MarkRansom 不,我想让代码更简短。 - user7035883
@MartinEvans 谢谢老兄,我会试一下。 - user7035883
你必须加载JPG文件吗?还是可以直接使用已经存在的numpy数组? - mmensing
@mmensing 我使用一个numpy数组,它每秒更新多次其值,并且我想在每次更新后将其(转换为图像)显示给用户。 - user7035883
1个回答

5

因为在评论中提到了IO不是问题,所以我们将直接使用 matplotlib 中可用的标准图像绘制工具,因为它是 Python 的事实标准绘图库。虽然不知道神经网络生成的典型图像的尺寸,但快速比较调用例如 imshowpcolormeshmatshow 以获取不同图像尺寸所需的平均时间是没什么坏处的(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基本上会尽可能频繁地更新图形。我希望这能指引您走向正确方向并且对您有所帮助。如果您不想使用动画,则需要手动处理画布清除和/或复制。

这个不行,plt.show() 阻塞了线程,然后什么也没发生。 - Raphael Royer-Rivard
抱歉晚批准了,我只是想快点买烟。 - user7035883

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接