OpenCV Python VideoWriter는 손상된 비디오를 저장합니다.
Sep 16 2020
비디오에서 프레임을 수정하기 전에 비디오를 복사하는 아주 간단한 예를 얻으려고합니다. 그러나 output.avi 비디오는 2.8mb barriers.avi 비디오에 비해 5kb 손상된 파일입니다. OpenCV 버전 4.2.0 및 Python 버전 3.7.7을 사용하고 있습니다.
다음은 코드입니다.
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()
프레임 모양을 인쇄하면 다음과 같은 결과가 나타납니다.
(480, 640, 3)
참고 : 다른 스택 오버플로 솔루션은 도움이되지 않았습니다.
편집 : cv2.imshow ()를 사용하면 모든 프레임이 잘 표시됩니다.
답변
3 Ahx Sep 16 2020 at 03:08
코드에서 두 가지 문제를 해결하고 싶습니다.
이슈 # 1 : :.avi동영상 파일을 만들고 싶습니다. 따라서 다음과 같이 fourcc를 초기화해야합니다MJPG.
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
비디오 파일을 만들기위한 특정 조합이 있습니다. 예를 들어, 생성 .mp4하려면 fourcc를 *'mp4v'.
문제 # 2 : 출력 비디오의 크기가 입력 프레임과 동일한 지 확인하십시오. 예 : Videowriter 개체 크기를 선언했습니다(height, width). 그러면 프레임 크기가 같아야합니다.
frame = cv2.resize(frame, (height, width))
암호:
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()