9

我有这个简单的 python 脚本,它使用 OpenCV 从文件夹中加载图像并循环显示它们。我想使用matplotlib.

import cv2 as cv
import os

im_files = [for f in os.listdir('.') if f[-3:] == 'png']

for f in im_files:
    im = cv.imread(f, 0) #read image in greyscale
    cv.imshow('display', im)
    cv.waitKey(1)

cv.destroyAllWindows()

我尝试了以下脚本,但打开以显示绘图的 pyplot 窗口变得无响应。

import pylab as pl
import os

files = [f for f in os.listdir('.') if f[-3:] == 'png']
pl.ion()
for f in files:
    im=pl.imread(f)
    pl.imshow(im)
    pl.draw()

我用谷歌搜索了很多,但找不到任何解决方案。我该怎么做呢?我在 Windows 8 上使用 Anaconda 1.6 32 位。

4

3 回答 3

25
img = None
for f in files:
    im=pl.imread(f)
    if img is None:
        img = pl.imshow(im)
    else:
        img.set_data(im)
    pl.pause(.1)
    pl.draw()
于 2013-07-26T20:17:35.803 回答
4

我已经实现了一个基于 matplotlib 的便捷脚本,它正好满足您的需求等等。在这里检查

在您的情况下,以下代码段应该可以工作:

import os
from scipy.misc import imread

img_files = [for f in os.listdir('.') if f[-3:] == 'png']

# redraw_fn draw frame f in a image sequence
def redraw_fn(f, axes):
    img_file = img_files[f]
    img = imread(img_file)
    if not redraw_fn.initialized:
        redraw_fn.im = axes.imshow(img, animated=True)
        redraw_fn.initialized = True
    else:
        redraw_fn.im.set_array(img)
redraw_fn.initialized = False

videofig(len(img_files), redraw_fn, play_fps=30)
于 2017-05-10T06:04:55.823 回答
3

我喜欢以下这样做的方式,这种方式非常简单,并且允许更新整个图形,包括标题、标签等,而不仅仅是图像。

import numpy as np
from matplotlib import pyplot as plt

for j in range(0,3):
    img = np.random.normal(size=(100,150))
    plt.figure(1); plt.clf()
    plt.imshow(img)
    plt.title('Number ' + str(j))
    plt.pause(3)

形成随机图像。

plt.figure如果该图形尚不存在,则第一次创建该图形,然后将图形 1 设为当前图形。

plt.clf清除图形,以便后续更新不会相互重叠。然后图像会显示一个标题。

plt.pause语句是关键,因为这会导致更新显示 - 包括标题、标签等。

于 2018-03-15T22:58:58.280 回答