Convert Between Image Sequences and Video
This example shows how to convert between video files and sequences of image files using VideoReader and VideoWriter.
The sample file shuttle.avi contains 121 frames. Convert the frames to image files using VideoReader and the imwrite function. Then, convert the image files to an AVI file using VideoWriter.
Setup
Create a temporary working folder to store the image sequence.
workingDir = tempname;
mkdir(workingDir)
mkdir(workingDir,"images")Create VideoReader Object
Create a VideoReader object to use for reading frames from the sample file.
shuttleVideo = VideoReader("shuttle.avi");Create Image Sequence
Loop through the video, reading each frame into a width-by-height-by-3 array named img. Write each image to a JPEG file with a name in the form N.jpg, where N is the three-digit frame number.
i = 1; while hasFrame(shuttleVideo) img = readFrame(shuttleVideo); filename = sprintf("%03d",i)+".jpg"; fullname = fullfile(workingDir,"images",filename); imwrite(img,fullname) % Write to a JPEG file (001.jpg, 002.jpg, ..., 121.jpg) i = i+1; end
Find Image Filenames
Find all the JPEG filenames in the images folder. Convert the set of image names to a cell array.
imageNames = dir(fullfile(workingDir,"images","*.jpg")); imageNames = {imageNames.name}';
Create New Video with Image Sequence
Create a VideoWriter object, which creates a Motion-JPEG AVI file by default.
outputVideo = VideoWriter(fullfile(workingDir,"shuttle_out.avi"));
outputVideo.FrameRate = shuttleVideo.FrameRate;
open(outputVideo)Loop through the image sequence, load each image, and then write it to the video.
for i = 1:length(imageNames) img = imread(fullfile(workingDir,"images",imageNames{i})); writeVideo(outputVideo,img) end
Finalize the video file.
close(outputVideo)
View Final Video
Create a VideoReader object.
shuttleAvi = VideoReader(fullfile(workingDir,"shuttle_out.avi"));Create a structure array from the video frames.
i = 1; while hasFrame(shuttleAvi) mov(i) = im2frame(readFrame(shuttleAvi)); i = i+1; end
Size a figure based on the width and height of the video, and then play the video one time.
vf = figure(Position=[0 0 shuttleAvi.Width shuttleAvi.Height]);
imshow(mov(1).cdata,Border="tight")
movie(vf,mov,1,shuttleAvi.FrameRate)
Clear VideoReader Objects
Clear the VideoReader objects.
clear shuttleVideo shuttleAvi
Credits
The space shuttle video is courtesy of NASA.