This tutorial will come in handy if you are interested in
learning about video processing using MATLAB. Techniques such as Reading and
writing a video file, displaying the frames and writing the frames as images in
a folder are discussed below.
To read a video file:
Vptr = VideoReader('VIDE01.mp4')
‘VideoReader’ command in MATLAB creates reader object for the
video file. This object contains the metadata or the parameters related to the
video such as Frame rate, Height and Width of the frames,duration of the video
etc.
To read all the frames in the video, we can use two methods. The
first method is to find the number of frames in the video and read it. The
second method is to read the frames until no more video frames are available.
Here in the tutorial, the frame rate is assumed to be constant throughout the
duration of the video. At constant frame rate, the number of frames in the
video is obtained by direct multiplication of frame rate and video duration. In
our example, the video is 13.29 seconds long and the frame rate is 24.0.
Multiplying 13.29 and 24 gives 318.96 that is 319 frames available in the
video.
1. To Read the frames in the video , display , save as image
file and store as mat file
EXAMPLE : 1
%MATLAB CODE:
Vptr = VideoReader('VIDE01.mp4');
%Num_Frames =
Vptr.NumberOfFrames;
NFrames =
round(Vptr.FrameRate*Vptr.Duration);
%Find the height and weight
of the frame
Nrows = Vptr.height;
Ncols = Vptr.width;
%Preallocate the matrix
Img_s =
zeros([Nrows,Ncols,NFrames]);
for i = 1:NFrames
%Read each
frame
Img =
readFrame(Vptr);
%To
display all the frames
figure,imshow(Img);
%To save
the images
Img_name=['Image',num2str(i),'.jpg'];
imwrite(Img,Img_name);
%To store
in MAT file
Img_s(:,:,i)=Img;
end
%Save the matrix as .mat
file
Save Video_Images.mat
Img_s;
EXPLANATION:
The above MATLAB code can
a. Display all the frames in the video
b. Save all the frames as images in the
current working directory
c. Store all the frames as images in a
multidimensional matrix and save it as ‘.mat’ file
After creating the video reader object, the
number of frames is computed using the frame rate and duration of the video. The
height and width of the frame can be obtained from the metadata.
‘readFrame’ extracts each frame sequentially
in the image format. The image can be further displayed using ‘imshow’ or
written to an image file using ‘imwrite’ command or stored in a
multidimensional matrix as stack of images.
The name format of the images saved in the
current working directory will be ‘Image1.jpg’,’Image2.jpg’…’Image319.jpg’
2. To read all the frames in the video and
display few frames
EXAMPLE 2:
%MATLAB CODE
Vptr = VideoReader('VIDE01.mp4');
NFrames =
round(Vptr.FrameRate*Vptr.Duration);
Jump_ptr = 27;
N = 1;
%To display the Images
for i=1:NFrames
Img =
readFrame(Vptr);
if(mod(i-1,Jump_ptr)==0)
figure(2),subplot(3,4,N),imshow(Img);
N=N+1;
end
end
EXPLANATION:
The above MATLAB code reads all the frames in
the video but displays only few frames. This example typically highlights the
use of MATLAB command ‘subplot’.
Instead of displaying all the frames, frames
with specific interval are displayed. In this instance,frame 1 will be displayed
first, frame 28 the next then followed by 55 and so on and so forth. ‘mod’
command is used to find the remainder after division, so whenever ‘i’ assumes
the value equal to multiples of the variable ‘Jump_ptr’ then the image will be
displayed. To displayall the images in the same figure, ‘subplot’ can be used.
‘subplot(3,4,N)’ refers that the ‘figure(2)’
can be divided into 3 rows and 4 columns and each image can be placed in each
position. In the given example, number
of frames =319 and the interval distance (Jump_ptr) is 27, then 319/27 gives
12. So the subplot is divided as 3 rows and 4 columns to allocate spacefor 12
images.
3. To read from a video file and write the
frames to another video file
%To write frames to the
video
Vptr = VideoReader('VIDE01.mp4');
Wptr = VideoWriter('VIDE02.mp4','MPEG-4');
Wptr.FrameRate=10;
open(Wptr);
for i=1:120
Img =
readFrame(Vptr);
writeVideo(Wptr,Img);
end
close(Wptr);
EXPLANATION:
Create the video reader object
using ‘VideoReader’ for ‘VIDEO1.mp4’
Create the video writer object
using ‘VideoWriter’ for ‘VIDEO2.mp4’
Set the frame rate for the video
to be written to a file.
Here, the frame rate 10 indicates,10
frames will be displayed per second in a video.
‘open’ command will open the
video file to start the writing process. Instead of 319 frames from the
original video(‘VIDEO1.MP4’), only 120 frames are written to the video file.So
it is unnecessary to go through all the frames in the video. First read the
frame from the input video file and write it to the output video file. After
120 frames are read from the input file and written to the output file, the output
file is closed.
4. To read a video file and
process the frames and write it to another video file
%To write frames to the
video
%Create video Reader object
Vptr = VideoReader('VIDE01.mp4');
%Find number of frames
NFrames =
round(Vptr.FrameRate*Vptr.Duration);
%Create Video Writer Object
Wptr = VideoWriter('VIDEO_NOISY.mp4','MPEG-4');
%Open the output video file
open(Wptr);
for i=1:NFrames
%Read from
video file
Img =
readFrame(Vptr);
%Add noise
to the image
Img =
imnoise(Img,'salt & pepper');
%write to
video file
writeVideo(Wptr,Img);
end
%Close the output video
file
close(Wptr);
EXPLANATION:
All the frames in the input video is
processed and then written to an output file. Here, noise is added to each
frame in the intermediate step and then written to the output video file. However,
instead of addition of noise, the image can be enhanced or processed in the
intermediate step.
EXAMPLE:
%EXAMPLE - VIDEO PROCESSING
%Set the frame rate
%Adjust the Image intensity
%Crop the Image
%Read 250 Frames
Vptr = VideoReader('VIDE01.mp4');
%Find number of frames
NFrames =
round(Vptr.FrameRate*Vptr.Duration);
%Create Video Writer Object
Wptr = VideoWriter('VIDEO_Enhance.mp4','MPEG-4');
Wptr.FrameRate = 10;
%Open the output video file
open(Wptr);
for i=1:230
%Read from video file
Img = readFrame(Vptr);
%Adjust the image intensity
Img = imadjust(Img,[0 0 0; 0.7 0.7
0.5],[]);
%Crop undesired portion
Img = Img(1:end,251:end,:);
%write to video file
writeVideo(Wptr,Img);
end
%Close the output video
file
close(Wptr);
EXPLANATION:
In this example, the frame rate is set to 10 and Instead of reading all the frames(319), 230 frames are read starting from the first frame. Each frame is enhanced and a portion of it is cropped as well.