Main Content

Creating Time-Lapse Video Using Postprocessed Data

This example shows how to create a time-lapse video by deleting unnecessary frames during postprocessing.

The Image Acquisition Toolbox™ makes it easy to produce time-lapse photography. In this example, we will use postprocessing to delete frames from an acquired sequence of images. This is ideal for situations where you are not sure which frames are relevant during capture, or where your processing would take too long to occur during the acquisition. A possible application would be to delete frames that have no motion relative to the previous frame. The primary disadvantage of this method of time decimation is that it requires large amounts of memory to store all the frames. This example acquires to memory, but you would likely acquire to an AVI file, and then use the VideoReader command to postprocess the frames.

Watch a day long time-lapse sequence.

Create a Video Input Object

Before acquiring images using the Image Acquisition Toolbox, create a video input object.

% When executing the following code, you may need to
% modify it to match your acquisition hardware.
vid = videoinput('winvideo',1,'RGB24_352x288');

Configure the Video Input Object

The configuration we will use is

  • Acquire 100 frames

vid.FramesPerTrigger = 100;
vid
Summary of Video Input Object Using 'Logitech QuickCam Fusion'.

   Acquisition Source(s):  input1 is available.

  Acquisition Parameters:  'input1' is the current selected source.
                           100 frames per trigger using the selected source.
                           'RGB24_352x288' video data to be logged upon START.
                           Grabbing first of every 1 frame(s).
                           Log data to 'memory' on trigger.

      Trigger Parameters:  1 'immediate' trigger(s) on START.

                  Status:  Waiting for START.
                           0 frames acquired since starting.
                           0 frames available for GETDATA.

Acquire and Retrieve the Frames

start(vid);
wait(vid);
framesavailable = vid.FramesAvailable;
framesavailable =

   100

frames = getdata(vid,framesavailable);

Postprocess the Acquired Frames

Here, simply remove every other frame. However, you could do processing that is much more complex.

toberemoved_index = [2:2:framesavailable];
frames(:,:,:,toberemoved_index) = [];
numframes = size(frames,4)
numframes =

    50

Render the Frames to an AVI File

Render the frames to an AVI file. To do this, create a VideoWriter object, call the writeVideo function to add all the frames to the AVI file, and then use the close function to release the resources associated with the AVI file.

vwObj = VideoWriter('timelapsevideo', 'Uncompressed AVI');
vwObj.FrameRate = 15;
open(vwObj);
writeVideo(vwObj, frames);
close(vwObj);

Play Back the Time-Lapse AVI Sequence

To play back the time-lapse AVI sequence, right-click on the filename in the MATLAB® Current Folder browser, and choose Open Outside MATLAB from the context menu.

Clean Up

When you are done with the video input object, you should use the delete function to free the hardware resources associated with it, and remove it from the workspace using the clear function. Also delete and clear the VideoWriter object.

delete(vid);
delete(vwObj);
clear vid vwObj;