图像序列与视频之间的转换
此示例说明如何使用 VideoReader
和 VideoWriter
在视频文件和图像文件序列之间转换。
示例文件 shuttle.avi
包含 121 帧。使用 VideoReader
和 imwrite
函数将这些帧转换为图像文件。然后,使用 VideoWriter
将图像文件转换为 AVI 文件。
设置
创建一个用于存储图像序列的临时工作文件夹。
workingDir = tempname;
mkdir(workingDir)
mkdir(workingDir,"images")
创建 VideoReader
对象
创建一个 VideoReader
对象,用于从示例文件中读取帧。
shuttleVideo = VideoReader("shuttle.avi");
创建图像序列
循环读取视频,将所有帧都读入到名为 img
的一个宽×高×3 的数组中。将每个图像写入一个以 N
.jpg
格式命名的 JPEG 文件,其中 N
是三位帧编号。
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
查找图像文件名称
在 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 i = 1:length(imageNames) img = imread(fullfile(workingDir,"images",imageNames{i})); writeVideo(outputVideo,img) end
最终生成视频文件。
close(outputVideo)
查看最终生成的视频
创建一个 VideoReader
对象。
shuttleAvi = VideoReader(fullfile(workingDir,"shuttle_out.avi"));
从视频帧创建一个结构体数组。
i = 1; while hasFrame(shuttleAvi) mov(i) = im2frame(readFrame(shuttleAvi)); i = i+1; end
基于视频的宽度和高度调整图窗大小,然后播放一次视频。
vf = figure(Position=[0 0 shuttleAvi.Width shuttleAvi.Height]);
imshow(mov(1).cdata,Border="tight")
movie(vf,mov,1,shuttleAvi.FrameRate)
清除 VideoReader
对象
清除 VideoReader
对象。
clear shuttleVideo shuttleAvi
感谢
航天飞机视频由美国国家航空航天局提供。