OpenCV Python VideoWriter salva vídeo corrompido

Sep 16 2020

Estou tentando obter um exemplo muito simples de cópia de um vídeo antes de começar a modificar os quadros no vídeo. No entanto, o vídeo output.avi é um arquivo corrompido de 5 kb em comparação com o vídeo walls.avi de 2,8 mb. Estou usando o OpenCV versão 4.2.0 e o Python versão 3.7.7.

Aqui está o 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()

Se eu imprimir o formato da moldura, obtenho:

(480, 640, 3)

Nota: Nenhuma das outras soluções de estouro de pilha ajudou.

Editar: Todos os quadros são exibidos corretamente se cv2.imshow () for usado.

Respostas

3 Ahx Sep 16 2020 at 03:08

Eu gostaria de abordar dois problemas em seu código:


Problema nº 1: você deseja criar um.aviarquivo de vídeo. Portanto, você precisa inicializar seu fourcc comoMJPG:

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

Existem certas combinações para criar um arquivo de vídeo. Por exemplo, se você deseja criar um, .mp4inicialize seu fourcc como *'mp4v'.


Problema nº 2: certifique-se de que o tamanho do vídeo de saída seja igual ao do quadro de entrada. Por exemplo: você declarou o tamanho do objeto Videowriter(height, width). Então, sua moldura deve ser do mesmo tamanho:

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