I have this simple python script using OpenCV to load images from a folder and display them in a loop. I want to reproduce this effect using matplotlib
.
<
I like the following way of doing this which is really straight-forward and allows the whole figure to be updated, including title, labels etc. rather than just the image.
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)
A random image is formed.
plt.figure
creates the figure the first time round if it does not already exist, and thereafter just makes figure 1 the current figure.
plt.clf
clears the figure so subsequent updates don't overlay each other. The image is then displayed with a title.
The plt.pause
statement is the key, since this causes the display to be updated - including title, labels etc.
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()
I have implemented a handy script based on matplotlib that just suits your need and much more. Check it here
In your case, the following snippet should work:
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)