OpenCV Python VideoWriter lưu video bị hỏng

Sep 16 2020

Tôi đang cố gắng lấy một ví dụ rất đơn giản về việc sao chép video trước khi bắt đầu sửa đổi khung hình trong video. Tuy nhiên, video output.avi là một tệp bị lỗi 5kb so với video 2,8 mb barrier.avi. Tôi đang sử dụng phiên bản OpenCV 4.2.0 và phiên bản Python 3.7.7.

Đây là mã:

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

Nếu tôi in hình dạng khung, tôi nhận được:

(480, 640, 3)

Lưu ý: Không có giải pháp chống tràn ngăn xếp nào khác hữu ích.

Chỉnh sửa: Tất cả các khung hiển thị tốt nếu sử dụng cv2.imshow ().

Trả lời

3 Ahx Sep 16 2020 at 03:08

Tôi muốn giải quyết hai vấn đề trong mã của bạn:


Vấn đề số 1:: Bạn muốn tạo một.avitệp video. Do đó, bạn cần khởi tạo bốncc của mình dưới dạngMJPG:

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

Có một số kết hợp nhất định để tạo tệp video. Ví dụ: nếu bạn muốn tạo một, .mp4bạn khởi tạo bốncc của mình với tư cách là *'mp4v'.


Vấn đề # 2: Đảm bảo kích thước của video đầu ra giống với khung đầu vào. Ví dụ: bạn đã khai báo kích thước đối tượng Videowriter của mình(height, width). Sau đó, khung của bạn phải có cùng kích thước:

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

Mã:


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