Vicent Sanchis

Accesibilidad, Ciencias de la Visión y WordPress

Crear una animación a partir de un conjunto de imágenes en un directorio con MATLAB

En este pequeño tutorial veremos como hacer una animación con MATLAB usando como fotogramas imágenes que tenemos en una carpeta.

Lo primero es listar los archivos que tenemos dentro de la carpeta, para ello usamos la función ls:

lista_archivos = ls;

Asumiremos que en esa carpeta únicamente hay imágenes para el video, si hubiese más archivos habría que filtrarlos por nombre o por extensión.

Acto seguido hay que crear un objeto de la clase VideoWriter y lo abrimos (no te preocupes si no entiendes qué significa todo esto):

objeto_video = VideoWriter('nombre.avi');
open(objeto_video);

Ahora llega el bucle. Pero antes ensayaremos a cargar la imagen con imread y después insertarla en el objeto:

fotograma = imread(lista_archivos(1,:));
writeVideo(objeto_video, fotograma);

Si todo ha funcionado bien estas dos líneas de código se van a tener que repetir para cada una de las imágenes que tenemos en la lista de archivos. Como esta lista tiene unas dimensiones conocidas lo que haremos será usar un bucle for.

for i = 3:length(lista_archivos)
    fotograma = imread(lista_archivos(5,:));
    writeVideo(objeto_video, fotograma);
end

NOTA: seguramente te habrás dado cuenta de que el bucle for no empieza en el primer elemento de la lista, esto es porque los dos primeros elementos de la lista son ‘.’ y ‘..’ (cosas del sistema de archivos y tal), la primera imagen está en la posición 3.

Y ya por último cerramos el objeto de vídeo:

close(objeto_video);

Y ya está. Se puede mejorar de mil maneras, por ejemplo podemos modificar los parámetros del video, la compresión, incluir un frame_skip si queremos que no coja todas las imágenes, meter una barra de progreso para tener una idea de por dónde va mientras se ejecuta, etc.

lista_archivos = ls;

objeto_video = VideoWriter('nombre.avi');
open(objeto_video);

for i = 3:length(lista_archivos)
    fotograma = imread(lista_archivos(i,:));
    writeVideo(objeto_video, fotograma);
end
close(objeto_video);


¿Alguna duda?


Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *