Convertir entre secuencias de imágenes y vídeo
Este ejemplo muestra cómo convertir entre archivos de vídeo y archivos de secuencias de imagen mediante VideoReader
y VideoWriter
.
El archivo de muestra shuttle.avi
contiene 121 fotogramas. Convierta los fotogramas a archivos de imagen mediante VideoReader
y la función imwrite
. Después, convierta los archivos de imagen a un archivo AVI mediante VideoWriter
.
Configuración
Cree una carpeta de trabajo temporal para almacenar la secuencia de imágenes.
workingDir = tempname;
mkdir(workingDir)
mkdir(workingDir,"images")
Crear un objeto VideoReader
Cree un objeto VideoReader
para leer los fotogramas del archivo de muestra.
shuttleVideo = VideoReader("shuttle.avi");
Crear una secuencia de imágenes
Recorra el vídeo leyendo cada fotograma en un arreglo de ancho por alto por 3 llamado img
. Escriba cada imagen en un archivo JPEG con un nombre con el formato N
.jpg
, en el que N
es el número de fotogramas de tres dígitos.
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
Encontrar nombres de archivos de imagen
Encuentre todos los nombres de archivos JPEG en la carpeta images
. Convierta el conjunto de nombres de imagen a un arreglo de celdas.
imageNames = dir(fullfile(workingDir,"images","*.jpg")); imageNames = {imageNames.name}';
Crear nuevos vídeos con secuencias de imágenes
Cree un objeto VideoWriter
, que crea un archivo AVI Motion-JPEG de forma predeterminada.
outputVideo = VideoWriter(fullfile(workingDir,"shuttle_out.avi"));
outputVideo.FrameRate = shuttleVideo.FrameRate;
open(outputVideo)
Recorra la secuencia de imágenes, cargue cada imagen y luego escríbala en el vídeo.
for i = 1:length(imageNames) img = imread(fullfile(workingDir,"images",imageNames{i})); writeVideo(outputVideo,img) end
Finalice el archivo de vídeo.
close(outputVideo)
Ver el vídeo final
Cree un objeto VideoReader
.
shuttleAvi = VideoReader(fullfile(workingDir,"shuttle_out.avi"));
Cree un arreglo de estructuras a partir de los fotogramas del vídeo.
i = 1; while hasFrame(shuttleAvi) mov(i) = im2frame(readFrame(shuttleAvi)); i = i+1; end
Dimensione una figura en función de la anchura y la altura del vídeo y, a continuación, reproduzca el vídeo una vez.
vf = figure(Position=[0 0 shuttleAvi.Width shuttleAvi.Height]);
imshow(mov(1).cdata,Border="tight")
movie(vf,mov,1,shuttleAvi.FrameRate)
Borrar objetos de VideoReader
Borre los objetos de VideoReader
.
clear shuttleVideo shuttleAvi
Créditos
El vídeo del transbordador espacial es cortesía de la NASA.