OpenCV Python VideoWriter lưu video bị hỏng
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
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()