es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

python cv2 grabar clips de 10 segundos infinitamente

Declaración del problema:
Básicamente estoy tratando de crear una cámara de tablero basada en Raspberry Pi Zero.
Necesito un fragmento de 10 segundos con el nombre de archivo como la fecha y hora actual. Este bucle debería continuar siempre que la Raspberry Pi tenga suministro de energía.
He escrito el script como se muestra, pero no crea archivos separados de fragmentos de 10 segundos, sino un solo archivo grande. ¿Alguna pista sobre qué estoy haciendo mal?

import cv2
import time

cv2.namedWindow("dashcam")
video = cv2.VideoCapture(1)

if video.isOpened():  # intenta obtener el primer fotograma
    rval, frame = video.read()
else:
    rval = False

frame_width = int(video.get(3))
frame_height = int(video.get(4))
timestr = time.strftime("%Y_%m_%d__%H_%M_%S")
out = cv2.VideoWriter(timestr + '.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 10, (frame_width, frame_height))

now = time.time()
while rval:
    rval, frame = video.read()
    if time.time() - now < 5:
        cv2.imshow('dashcam', frame)
        out.write(frame)
    elif time.time() - now > 5:
        now = time.time()
    key = cv2.waitKey(1)
    if key == 27:  # salir con ESC
        break

video.release()
out.release()
cv2.destroyAllWindows()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el script proporcionado es que captura continuamente la transmisión de video y la escribe en un solo archivo hasta que se interrumpe el bucle. Para crear archivos separados de clips de 10 segundos con el nombre del archivo como la fecha y hora actual, el script debe modificarse.

    Una manera de lograr esto es realizar un seguimiento de la hora de inicio y la hora de finalización de cada clip, y crear un nuevo archivo con el nombre como hora de inicio cuando el clip finaliza. Aquí hay un script modificado que implementa esto:

    import cv2
    import time
    
    cv2.namedWindow("dashcam")
    video = cv2.VideoCapture(1)
    
    if video.isOpened():  # intenta obtener el primer fotograma
        rval, frame = video.read()
    else:
        rval = False
    
    ancho_frame = int(video.get(3))
    alto_frame = int(video.get(4))
    duracion_clip = 10  # duración de cada clip en segundos
    hora_inicio = time.time()  # hora de inicio del clip actual
    hora_fin = hora_inicio + duracion_clip  # hora de finalización del clip actual
    nombre_archivo = time.strftime("%Y_%m_%d__%H_%M_%S") + ".avi"  # nombre del archivo del clip actual
    out = cv2.VideoWriter(nombre_archivo, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 10, (ancho_frame, alto_frame))
    
    while rval:
        rval, frame = video.read()
        ahora = time.time()
        if ahora > hora_fin:
            out.release()  # cierra el archivo del clip actual
            hora_inicio = ahora  # actualiza la hora de inicio del siguiente clip
            hora_fin = hora_inicio + duracion_clip  # actualiza la hora de finalización del siguiente clip
            nombre_archivo = time.strftime("%Y_%m_%d__%H_%M_%S", time.localtime(hora_inicio)) + ".avi"  # nombre del siguiente clip
            out = cv2.VideoWriter(nombre_archivo, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 10, (ancho_frame, alto_frame))
        cv2.imshow('dashcam', frame)
        out.write(frame)
        tecla = cv2.waitKey(1)
        if tecla == 27:  # salir al presionar ESC
            break
    
    video.release()
    out.release()
    cv2.destroyAllWindows()
    

    En este script modificado, la hora de inicio y la hora de finalización del clip actual se almacenan en las variables hora_inicio y hora_fin, respectivamente. El nombre del archivo del clip actual se construye utilizando la hora de inicio y se almacena en la variable nombre_archivo.

    El script captura continuamente la transmisión de video y la escribe en el archivo de clip actual hasta que se alcanza la hora de finalización. En ese momento, el script libera el archivo de clip actual y crea un nuevo archivo con el nombre basado en la hora de inicio del nuevo clip.

    Con esta modificación, el script debería crear archivos separados de clips de 10 segundos con el nombre como la fecha y hora actual.

Comments are closed.