OpenCV Python VideoWriter speichert beschädigtes Video

Sep 16 2020

Ich versuche, ein sehr einfaches Beispiel für das Kopieren eines Videos zu erhalten, bevor ich anfange, Frames im Video zu ändern. Das Video output.avi ist jedoch eine beschädigte 5-KB-Datei im Vergleich zum Video mit 2,8 MB barriere.avi. Ich verwende OpenCV Version 4.2.0 und Python Version 3.7.7.

Hier ist der 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()

Wenn ich die Rahmenform gedruckt habe, erhalte ich:

(480, 640, 3)

Hinweis: Keine der anderen Stapelüberlauflösungen hat geholfen.

Bearbeiten: Alle Frames werden gut angezeigt, wenn cv2.imshow () verwendet wird.

Antworten

3 Ahx Sep 16 2020 at 03:08

Ich möchte zwei Probleme in Ihrem Code ansprechen:


Problem Nr. 1 :: Sie möchten eine.aviVideodatei erstellen. Daher müssen Sie Ihren Fourcc wie folgt initialisierenMJPG:

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

Es gibt bestimmte Kombinationen zum Erstellen einer Videodatei. Wenn Sie beispielsweise ein erstellen möchten, .mp4initialisieren Sie Ihren Fourcc als *'mp4v'.


Problem Nr. 2: Stellen Sie sicher, dass die Größe des Ausgabevideos mit der des Eingabebilds übereinstimmt. Zum Beispiel: Sie haben Ihre Videowriter-Objektgröße angegeben(height, width). Dann muss Ihr Rahmen die gleiche Größe haben:

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