我有这个简单的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 32bit。
答案 0 :(得分:22)
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()
答案 1 :(得分:4)
我已经实现了一个基于matplotlib的方便脚本,它非常适合您的需求。检查here
在您的情况下,以下代码段应该有效:
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)
答案 2 :(得分:1)
我喜欢以下这样做的方式,它非常简单,可以更新整个图形,包括标题,标签等,而不仅仅是图像。
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
语句是关键,因为这会导致显示更新 - 包括标题,标签等。