Crear un video con imágenes – python openCV

A veces he querido unir frames como un video para visualizar bases de datos de imágenes o simplemente para hacer una animación tipo stop motion. En este post vamos a crear un video usando pocas imágenes y luego un video con más de 1000 imágenes usando python y openCV. Los códigos de este post se desarrollaron en Ubuntu, considera que para WINDOWS las direcciones que alojan las imágenes se escriben diferente.

También puedes revisar el video correspondiente a este tema:

Crear un video con pocos frames

Crear un video con los frames IMG_0001, IMG_0002, IMG_0003, IMG_0004, IMG_0005 y IMG_0006 es una tarea sencilla, ya que están ordenados y son pocos. El código es el siguiente:

Desplegar la explicación del código

  1. Importar cv2, paquete openCV
  2. Leer frames con .imread
    • Si los frames están en la misma carpeta que el script escribe el nombre IMG_00XX.jpg y si se encuentra en otra carpeta colocar el directorio completo Ej:  ‘/home/noemi/Escritorio/Proy_Ocv/db_0/IMG_00XX.jpg’
  3. img6.shape[:2] devuelve el tamaño de la imagen en filas height y columnas width. El video debe tener el mismo tamaño que las imágenes.
  4. El objeto video de tipo VideoWriter contiene las características.
    • Se creará con el nombre db0.wmv, codec cv2.VideoWriter_fourcc(*‘mp4v’), 2 frames por segundo, y con el ancho, alto = (width,height)
  5. Usar método .write para poner cada frame en el video db0.wmv
  6. Usar .realese para cerrar el dispositivo de captura.
import cv2

#Leer imagenes
img1 = cv2.imread('IMG_0001.jpg')
img2 = cv2.imread('IMG_0002.jpg')
img3 = cv2.imread('IMG_0003.jpg')
img4 = cv2.imread('IMG_0004.jpg')
img5 = cv2.imread('IMG_0005.jpg')
img6 = cv2.imread('IMG_0006.jpg')

#Dimensiones de la última imagen alto y ancho
height, width  = img6.shape[:2]

#Caracteristicas del video
video = cv2.VideoWriter('db0.wmv',cv2.VideoWriter_fourcc(*'mp4v'),2,(width,height))

# Poner cada frame en video
video.write(img1)
video.write(img2)
video.write(img3)
video.write(img4)
video.write(img5)
video.write(img6)

#liberar recursos
video.release() 
Descarga estos archivos en GitHub

Crear un video con más de 1000 frames

Las imágenes de la base de datos están nombradas así:

  • 2013_09_20_17_24_45_225000_right.tif
  • 2013_09_20_17_24_45_556000_right.tif
  • 2013_09_20_17_24_45_870000_right.tif
Desplegar la explicación del código

  1. Importar el paquete openCV y el módulo os
  2. Variable path contiene la ubicación de los archivos de la base de datos
  3. Variable archivos
    • os.listdir(path) contiene los nombres de todos los archivos de la ubicación pathtodos los archivos del directorio deben ser imágenes, si hay más documentos (pdf, doc, xlsx, etc ) o imágenes de diferentes tamaños al momento de crear el video aparecerá un error.
    • sorted ordena los archivos
    • img_array arrar vacío para almacenar los frames
  4. Bucle for para cargar frames del directorio
    • len(archivos) obtiene la cantidad de archivos en la base de datos
    • nomArchivo = archivos[x] guarda el nombre del archivo de acuerdo a la iteración que realice el bucle for
    • dirArchivo guarda la dirección y el nombre del cada archivo
    • Objeto img usa el método .imread para cargar frames
    • Método .append agrega un elemento img al array img_array
  5. El video debe tener el mismo tamaño que los frames, img.shape[:2] devuelve el tamaño de la imagen en filas height y columnas width.
  6. El objeto video de tipo VideoWriter contiene las características del video.
    • Se creará con el nombre ‘CVC-08.avi’, codec cv2.VideoWriter_fourcc(*‘DIVX’)10 frames por segundo, y con el ancho, alto = (960,480)
  7. Bucle for crea un video con el arreglo de frames
    • len(img_array) contiene el número de ítems del arreglo img_array
    • Método .write para poner cada frame en el video ‘db0.wmv’
  8. Usar .realese para cerrar el dispositivo de captura.
#Importra librerías
import os
import cv2
#Ubicación de la base de datos
path = '/home/noemi/Escritorio/Bases de datos/CVC08/Test/FramesPos/'
archivos = sorted(os.listdir(path))
img_array = []

#Leer imagenes
for x in range (0,len(archivos)):
    nomArchivo = archivos[x]
    dirArchivo = path + str(nomArchivo)
    img = cv2.imread(dirArchivo)
    img_array.append(img)
    
#Dimensiones de los frames alto y ancho
height, width  = img.shape[:2]

#Caracteríasticas video
video = cv2.VideoWriter('CVC-08.avi', cv2.VideoWriter_fourcc(*'DIVX'), 10, (width,height))

#Colocar los frames en video
for i in range(0, len(archivos)):
    video.write(img_array[i])
    
#liberar
video.release()  

Deja un comentario

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