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- Importar
cv2
, paquete openCV - 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’
- Si los frames están en la misma carpeta que el script escribe el nombre
img6.shape[:2]
devuelve el tamaño de la imagen en filasheight
y columnaswidth
. El video debe tener el mismo tamaño que las imágenes.- El objeto
video
de tipoVideoWriter
contiene las características.- Se creará con el nombre
db0.wmv
, codeccv2.VideoWriter_fourcc(*‘mp4v’)
,2
frames por segundo, y con elancho, alto = (width,height)
- Se creará con el nombre
- Usar método
.write
para poner cada frame en el videodb0.wmv
- 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()
Crear un video con más de 1000 frames
Si tienes varias imágenes sería una tarea tediosa escribir de uno en uno los nombres de los frames en el código. En esta parte crearemos el video con la base datos CVC-08: On-board Sequence Pedestrian Dataset. Leeré los frames y crearé el video con un bucle for
respectivamente.
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
Para leer los frames en orden usemos el módulo os que permite gestionar los archivos, y el código queda como se muestra a continuación.
Desplegar la explicación del código- Importar el paquete openCV y el módulo os
- Variable
path
contiene la ubicación de los archivos de la base de datos - Variable
archivos
os.listdir(path)
contiene los nombres de todos los archivos de la ubicaciónpath
, todos 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
- Bucle
for
para cargar frames del directoriolen(archivos)
obtiene la cantidad de archivos en la base de datosnomArchivo = archivos[x]
guarda el nombre del archivo de acuerdo a la iteración que realice el bucle fordirArchivo
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 elementoimg
al arrayimg_array
- El video debe tener el mismo tamaño que los frames,
img.shape[:2]
devuelve el tamaño de la imagen en filasheight
y columnaswidth
. - 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)
- Se creará con el nombre ‘CVC-08.avi’, codec cv2.VideoWriter_fourcc(*‘DIVX’), 10 frames por segundo, y con el ancho, alto =
- Bucle
for
crea un video con el arreglo de frameslen(img_array)
contiene el número de ítems del arregloimg_array
- Método
.write
para poner cada frame en el video ‘db0.wmv’
- 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()