设置
创建一个用于存储图像序列的临时工作文件夹。
workingDir = tempname;
mkdir(workingDir)
mkdir(workingDir,'images')
创建 VideoReader
创建一个用于从文件中读取帧的 VideoReader。
shuttleVideo = VideoReader('shuttle.avi');
创建图像序列
循环读取视频,将所有帧都读入到名为 img 的一个宽×高×3 的数组中。将每个图像写入一个以 imgN.jpg 格式命名的 JPEG 文件,其中 N 是帧编号。
| img001.jpg|
| img002.jpg|
| ...|
| img121.jpg|
ii = 1;
while hasFrame(shuttleVideo)
img = readFrame(shuttleVideo);
filename = [sprintf('%03d',ii) '.jpg'];
fullname = fullfile(workingDir,'images',filename);
imwrite(img,fullname) % Write out to a JPEG file (img1.jpg, img2.jpg, etc.)
ii = ii+1;
end
查找图像文件名称
找到 images 文件夹中的所有 JPEG 文件名。将这组图像名称转换为元胞数组。
imageNames = dir(fullfile(workingDir,'images','*.jpg'));
imageNames = {imageNames.name}';
使用图像序列创建新视频
构造一个 VideoWriter 对象,默认情况下该对象会创建一个 Motion-JPEG AVI 文件。
outputVideo = VideoWriter(fullfile(workingDir,'shuttle_out.avi'));
outputVideo.FrameRate = shuttleVideo.FrameRate;
open(outputVideo)
循环读取图像序列,加载每个图像,然后将其写入到视频。
for ii = 1:length(imageNames)
img = imread(fullfile(workingDir,'images',imageNames{ii}));
writeVideo(outputVideo,img)
end
最终生成视频文件。
close(outputVideo)
查看最终生成的视频
构造一个 reader 对象。
shuttleAvi = VideoReader(fullfile(workingDir,'shuttle_out.avi'));
根据视频帧创建一个 MATLAB 影片结构体。
ii = 1;
while hasFrame(shuttleAvi)
mov(ii) = im2frame(readFrame(shuttleAvi));
ii = ii+1;
end
基于视频的宽度和高度调整当前图窗及其坐标区的大小,并查看影片的第一帧。
figure
imshow(mov(1).cdata, 'Border', 'tight')
按照视频的帧速率播放影片一次。
movie(mov,1,shuttleAvi.FrameRate)
感谢
感谢 NASA 提供的航天飞机视频。