OpenCV Python VideoWriter enregistre la vidéo corrompue

Sep 16 2020

J'essaie d'obtenir un exemple très simple de copie d'une vidéo avant de commencer à modifier les images de la vidéo. Cependant, la vidéo output.avi est un fichier corrompu de 5 Ko par rapport à la vidéo barrières.avi de 2,8 Mo J'utilise OpenCV version 4.2.0 et Python version 3.7.7.

Voici le code:

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 j'imprime la forme du cadre, j'obtiens:

(480, 640, 3)

Remarque: aucune des autres solutions de débordement de pile n'a aidé.

Edit: Tous les cadres s'affichent correctement si cv2.imshow () est utilisé.

Réponses

3 Ahx Sep 16 2020 at 03:08

Je voudrais aborder deux problèmes dans votre code:


Problème n ° 1:: Vous souhaitez créer un.avifichier vidéo. Par conséquent, vous devez initialiser votre fourcc comme suitMJPG:

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

Il existe certaines combinaisons pour créer un fichier vidéo. Par exemple, si vous souhaitez créer un, .mp4vous initialisez votre fourcc en tant que *'mp4v'.


Problème n ° 2: assurez-vous que la taille de la vidéo de sortie est la même que celle de l'image d'entrée. Par exemple: vous avez déclaré la taille de votre objet Videowriter(height, width). Ensuite, votre cadre doit être de la même taille:

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

Code:


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