OpenCV Python VideoWriter guarda video dañado

Sep 16 2020

Estoy tratando de obtener un ejemplo muy simple de copiar un video antes de comenzar a modificar fotogramas en el video. Sin embargo, el video de output.avi es un archivo corrupto de 5 kb en comparación con el video de 2.8 MB de obstáculos. Estoy usando OpenCV versión 4.2.0 y Python versión 3.7.7.

Aquí está el código:

import cv2

input = cv2.VideoCapture("../video/barriers.avi")
height = int(input.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(input.get(cv2.CAP_PROP_FRAME_WIDTH))

fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('../video/output5.avi', fourcc, 30, (height, width), isColor=True)

while input.isOpened():
    # get validity boolean and current frame
    ret, frame = input.read()

    # if valid tag is false, loop back to start
    if not ret:
        break
    else:
        out.write(frame)

input.release()
out.release()

Si imprimí la forma del marco, obtengo:

(480, 640, 3)

Nota: Ninguna de las otras soluciones de desbordamiento de pila ha ayudado.

Editar: Todos los marcos se muestran bien si se usa cv2.imshow ().

Respuestas

3 Ahx Sep 16 2020 at 03:08

Me gustaría abordar dos problemas en su código:


Problema n. ° 1: desea crear un.aviarchivo de video. Por lo tanto, debe inicializar su fourcc comoMJPG:

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

Existen ciertas combinaciones para crear un archivo de video. Por ejemplo, si desea crear un .mp4, inicialice su fourcc como *'mp4v'.


Problema n. ° 2: asegúrese de que el tamaño del video de salida sea el mismo que el del marco de entrada. Por ejemplo: declaró el tamaño de su objeto Videowriter(height, width). Entonces tu marco debe ser del mismo tamaño:

frame = cv2.resize(frame, (height, width))

Código:


import cv2

cap = cv2.VideoCapture("output.mp4")
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output5.avi', fourcc, 30, (width, height), isColor=True)

while cap.isOpened():
    # get validity boolean and current frame
    ret, frame = cap.read()

    # if valid tag is false, loop back to start
    if not ret:
        break
    else:
        frame = cv2.resize(frame, (width, height))
        out.write(frame)

cap.release()
out.release()