OpenCV Python VideoWriter salva i video danneggiati

Sep 16 2020

Sto cercando di ottenere un esempio molto semplice di copia di un video prima di iniziare a modificare i fotogrammi nel video. Tuttavia, il video output.avi è un file danneggiato di 5 kb rispetto al video barriers.avi da 2,8 mb. Sto usando OpenCV versione 4.2.0 e Python versione 3.7.7.

Ecco il codice:

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()

Se stampo la forma della cornice, ottengo:

(480, 640, 3)

Nota: nessuna delle altre soluzioni di overflow dello stack ha aiutato.

Modifica: tutti i frame vengono visualizzati correttamente se viene utilizzato cv2.imshow ().

Risposte

3 Ahx Sep 16 2020 at 03:08

Vorrei affrontare due problemi nel tuo codice:


Problema n. 1: si desidera creare un.avifile video. Pertanto è necessario inizializzare il tuo fourcc comeMJPG:

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

Esistono alcune combinazioni per creare un file video. Ad esempio, se vuoi creare un .mp4, inizializza il tuo fourcc come *'mp4v'.


Problema # 2: assicurati che la dimensione del video in uscita sia la stessa del fotogramma di input. Ad esempio: hai dichiarato la dimensione del tuo oggetto Videowriter(height, width). Quindi la tua cornice deve avere le stesse dimensioni:

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

Codice:


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()