Capturar, guardar y leer un video en OpenCV y Python

Por Administrador

 

CONTENIDO

  1. Capturar un video
  2. Leer un video
  3. Guardar un video

En el post anterior vimos como cargar una imagen, visualizarla y guardar una nueva, pero ahora es tiempo de adentrarnos a la secuencia de imágenes, es decir a un video. A continuación podrás aprender como capturar, leer y guardar un video a usando Python y OpenCV. Así que ¡menos palabras y más programación!.

CAPTURAR UN VIDEO (REALIZAR UN VIDEO STREAMING)

Para poder realizar esta acción necesitaremos el siguiente código (si te parece un poco confuso, ¡tranquilidad!, te explico cada línea abajo).

import cv2

captura = cv2.VideoCapture(0)
while (captura.isOpened()):
  ret, imagen = captura.read()
  if ret == True:
    cv2.imshow('video', imagen)
    if cv2.waitKey(1) & 0xFF == ord('s'):
      break
  else: break
captura.release()
cv2.destroyAllWindows()

Empezamos a desglosar el programa:

Línea 1: Importar OpenCV con import cv2

Línea 3: Asignamos a una variable (para hacer más sencillo el proceso, y no tener que escribir en cada momento la función) cv2.VideoCapture(0), la cual nos permitirá iniciar el proceso de captura del video.

El número dentro de los paréntesis indica que cámara se usa para la captura, si se tiene una cámara conectada se puede colocar 0 o -1. En el caso de que hubiese más cámaras conectadas y se deseara trabajar alguna de ellas se tendría que especificar con cual, 1, 2 o 3, por ejemplo.

Línea 4: Aquí tenemos la estructura de repetición while, la cual será infinita mientras se esté capturando el video hasta que sea presionada una tecla como veremos a continuación.

Línea 5: La función .read(), en este caso captura.read(), desempaqueta dos valores, el primero es una variable booleana, y el segundo la imagen en sí. A continuación brevemente las dos variables obtenidas en este programa:

ret: Esta variable booleana es True cuando SÍ se ha capturado una imagen, mientras que es False cuando NO se ha capturado una imagen con la cual trabajar.

imagen: En sí es la imagen con la cual se puede trabajar.

Línea 6: Este condicionante: if ret == True, nos permite seguir si es que existe una imagen capturada, también se podría comparar con False, y aplicar break, en caso que no se tenga la imagen.

Línea 7: Aquí se procede a visualizar la imagen, como lo vimos en el anterior post.

Línea 8: Este condicionante va a permitir salir del programa o terminar la visualización, hasta que sea presionada la tecla s. Se añade & 0xFF, cuando la máquina en la que se está realizando el programa es de 64 bits.

Línea 9: Si durante la ejecución del programa se ha presionado la tecla s, entonces se activa break, y sale del while.

Línea 10: Este esle corresponde con el if de la línea 6, y sale del proceso  con break.

Línea 11: Se libera la captura del video.

Línea 12: Se cierran las ventanas abiertas de la visualización.

GUARDAR UN VIDEO

Para grabar un video y guardarlo necesitamos de un programa similar al previo, veamos:

import cv2

captura = cv2.VideoCapture(0)
salida = cv2.VideoWriter('videoSalida.avi',cv2.VideoWriter_fourcc(*'XVID'),20.0,(640,480))

while (captura.isOpened()):
  ret, imagen = captura.read()
  if ret == True:
    cv2.imshow('video', imagen)
    salida.write(imagen)
    if cv2.waitKey(1) & 0xFF == ord('s'):
      break
  else: break
captura.release()
salida.release()
cv2.destroyAllWindows()

Analicemos las líneas nuevas:

Línea 4: Para grabar un video necesitamos de la función cv2.VideoWriter, en ella especificamos el nombre del video con el que se guarda el video seguido de su extensión, el segundo argumento es el codec del video (si quieres más información puedes buscar en los docs de OpenCV). Como tercer argumento se indica el número de fps (frames per second / fotogramas por minuto), y finalmente se especifica el tamaño de los fotogramas (640,480), 640 pixeles de ancho y 480 de alto.

Línea 10: Dentro de los paréntesis de la función salida.write, especificamos la imagen o fotograma que queremos que se almacene.

Línea 15: Se indica que la grabación finalice.

LEER UN VIDEO

El programa necesario para realizar la lectura de un video, es similar al de realizar un video stream, como vimos en primer lugar, ¿Quieres saber cuál es la diferencia?

import cv2

captura = cv2.VideoCapture('videoSalida.avi')
while (captura.isOpened()):
  ret, imagen = captura.read()
  if ret == True:
    cv2.imshow('video', imagen)
    if cv2.waitKey(30) == ord('s'):
      break
  else: break
captura.release()
cv2.destroyAllWindows()

Línea 3: En vez de especificar el número de cámara que se utilizaba en el caso de realizar un video streaming, aquí lo que se hace es simplemente especificar entre comillas el nombre del video junto a su extensión. Recuerda que si el video está en una localización diferente a de tu programa, será necesario indicar toda la dirección.

NOTA: Pudiste haber notado que en cv2.waitKey, se especificó 30 y no 1 como hemos visto hasta el momento. Con 30 el video se aprecia mejor con respecto a la velocidad del mismo. Por el contrario con 1, puede que tu video pase considerablemente rápido, esto es debido a que OpenCV quiere realizar el proceso lo más rápido posible sin importar el fps original del video.

Esto fue todo por este post, recuerda que puedes complementar la información con los videos de mi canal. Recuerda que podemos seguir aprendiendo juntos.

Resumen del contenido de este post