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ódigoimport cv2
: importar biblioteca openCVimport datetime as dt
: importar módulo datetime con un alias dtcapture = cv2.VideoCapture(0)
captura información desde la webCam, el valor de0
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 momentopath
: es la dirección donde se guardarán los frameswhile (capture.isOpened()):
capture.isOpened()
DevuelveTrue
si la captura de video ya se ha inicializado.ret, frame = capture.read()
, usa el objetocapture
para leer la información de la webCamframe
información del video frame por frameret
valor booleanoTRUE
siframe
es leído correctamente
tiempoB = dt.datetime.now()
: guarda en la variable tiempoB la hora exacta en ese momentotiempoTranscurrido = tiempoB - tiempoA
: calcula el tiempo transcurrido entre el puntoB del código y el puntoAif 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íficodt.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 capturacv2.destroyAllWindows()
cerrar todas las ventanas
Símbolo | Significa | Formato |
%Y | Año | 0001, 0002, …, 2013, 2014, …, 9998, 9999 |
%m | Mes | 01, 02, …, 12 |
%d | Día | 01, 02, …, 31 |
%H | Hora (Reloj de 24 horas) | 00, 01, …, 23 |
%M | Minutos | 00, 01, …, 59 |
%S | Segundos | 00, 01, …, 59 |
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()