Guardar frames cada cierto tiempo con Python – openCV

En este post detallaré como guardar frames de un video cada cierto tiempo, los almacenaré con el formato de fecha y hora en que fueron capturados así: IMG-2022-04-05-094709.jpg. Para realizar esto combinaremos el código que mide el tiempo transcurrido de una instrucción y el código de un post anterior Extraer frames de un video.

Medir el tiempo de ejecución en Python

El tiempo transcurrido en una acción lo mediremos restando el tiempo final y el tiempo inicial. Imagina que vas caminando y quieres saber cuanto tardaste en tu caminata, para conocer eso restas el tiempo en el que llegaste – el tiempo en el que comenzaste a caminar.

Para medir el tiempo transcurrido entre instrucciones usaré el módulo datetime. El código es el siguiente:

import datetime as dt

tiempoA = dt.datetime.now()

#Cualquier instrucción python-------------------------------------------
print("¿Cuánto tardará en imprimir el resultado de una multiplicación?")
print("Resultado de la multiplicación:", 50*50)
#------------------------------------------------------------------------
tiempoB = dt.datetime.now()

tiempoTranscurrido = tiempoB - tiempoA
print("tiempo transcurrido:", tiempoTranscurrido)

El resultado al ejecutar el código anterior es:

¿Cuánto tardará en imprimir el resultado de una multiplicación?
Resultado de la multiplicación: 2500
tiempo transcurrido: 0:00:00.000058

En mi computadora, han transcurrido 58 microsegundos, tu resultado puede variar por las características de tu hardware.

Guardar frames cada cierto tiempo usando Python

Para entender el código revisa los dos post anteriores:

Desplegar la explicación del código

  • import cv2: importar biblioteca openCV
  • import datetime as dt: importar módulo datetime con un alias dt
  • capture = cv2.VideoCapture(0) captura información desde la webCam, el valor de 0 va según el puerto donde esté conectada la cámara (puede ser -1,1,2,0,etc). También puede ser reemplazada por una dirección para leer un video.
  • tiempoA = dt.datetime.now(): Guarda en la variable tiempoA. La hora exacta en ese momento
  • path: es la dirección donde se guardarán los frames
  • while (capture.isOpened()):
    • capture.isOpened() Devuelve True si la captura de video ya se ha inicializado.
    • ret, frame = capture.read(), usa el objeto capture para leer la información de la webCam
    • frame información del video frame por frame
    • ret valor booleano TRUE si frame es leído correctamente
  • tiempoB = dt.datetime.now(): guarda en la variable tiempoB la hora exacta en ese momento
  • tiempoTranscurrido = tiempoB - tiempoA: calcula el tiempo transcurrido entre el puntoB del código y el puntoA
  • if tiempoTranscurrido.seconds >= 3:: Si en tiempo transcurrido es mayor o igual a 3 segundos, ingresa a la sentencia if.
    • cv2.imwrite: Guarda el frame como un archivo en un formato específico
    • dt.datetime.now().strftime('IMG-%Y-%m-%d-%H%M%S'): Obtiene la hora actual en el momeno que guardaré la imagen y con .strftime() le damos el formato como muestra format codes. En la tabla I muestro los formats que uso en este ejemplo.
    • tiempoTranscurrido = 0: Colocar en cero el tiempo trascurrido para volver a contar 3 segundos.
    • tiempoA = dt.datetime.now(): Establecer un nuevo tiempoA para volver a contar
  • if (cv2.waitKey(1) == ord('s')):, sentencia if compara dos valores, si se cumple la condición termina el bucle.
    • cv2.waitKey(1), si una tecla es presionada, regresa un valor de acuerdo al código ascii, mientras no se presione una tecla devuelve el valor de -1
    • ord('s') la función ord recibe un caracter y devuelve un valor que representa a ese caracter.
    • (cv2.waitKey(1) == ord('s')) –> 1110011 == 01110011 (Cuando se cumple, sale del bucle)
  • capture.release() para liberar la captura
  • cv2.destroyAllWindows() cerrar todas las ventanas
SímboloSignificaFormato
%YAño0001, 0002, …, 2013, 2014, …, 9998, 9999
%mMes01, 02, …, 12
%dDía01, 02, …, 31
%HHora (Reloj de 24 horas)00, 01, …, 23
%MMinutos00, 01, …, 59
%SSegundos00, 01, …, 59
Tabla 1. Símbolos usados en este ejemplo
import cv2
import datetime as dt

capture = cv2.VideoCapture(0)
#Inicializar  tiempo
tiempoA = dt.datetime.now()
path = '/home/kipuna/Escritorio/frames/'

while (capture.isOpened()):
    ret, frame = capture.read()
    if (ret == True):
        #Almacenar el tiempo actual
        tiempoB = dt.datetime.now()
        #Cuanto tiempo ha pasado desde tiempoA?
        tiempoTranscurrido = tiempoB - tiempoA
        cv2.imshow("webCam", frame)
        #Si han pasado 3 segundos ingresa al if
        if tiempoTranscurrido.seconds >= 3:
            cv2.imwrite(path + dt.datetime.now().strftime('IMG-%Y-%m-%d-%H%M%S') +'.jpg' , frame)
            #Se debe encerar el tiempo trascurrido para voler a contar
            tiempoTranscurrido = 0
            #Se debe establecer un nuevo tiempoA
            tiempoA = dt.datetime.now()
        if (cv2.waitKey(1) == ord('s')):
            break
    else:
        break

capture.release()
cv2.destroyAllWindows()

Deja un comentario

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