황선규 박사님의 OpenCV 강의를 공부하면서 정리하였습니다.
동영상 저장하기 - cv2.VideoWriter 클래스
cv2.VideoWriter 클래스를 이용해서 영상을 저장하는 방법을 알아보겠습니다.
OpenCV에서는 cv2.VideoWriter 클래스를 이용하여 일련의 프레임을 동영상 파일로 저장할 수 있습니다.
일련의 프레임은 모두 크기와 데이터 타입이 같아야 합니다.
또한 Fourcc (4-문자 코드, four character code)를 지정해줘야 합니다.
Fourcc는 동영상 파일의 코덱, 압축 방식, 색상, 픽셀 포맷 등을 정의하는 정수 값입니다.
1. 저장을 위한 동영상파일 열기
영상을 저장하기 위해서는 cv2.VideoWriter 객체를 생성해야 합니다.
[명령어 설명]
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=None) -> retval
저장하고 싶은 영상의 속성값을 지정해줘야 합니다.
• filename : 비디오 파일 이름 (e.g. 'video.mp4')
• fourcc : fourcc (e.g. cv2.VideoWriter_fourcc(*'DIVX'))
• fps : 초당 프레임 수 (e.g. 30)
• frameSize : 프레임 크기. (width, height) 튜플.
• isColor : 컬러 영상이면 True, 그렇지않으면 False. 기본값은 True입니다.
• retval : cv2.VideoWriter 객체
[예시 코드]
# 노트북 웹캠에서 받아오는 영상을 저장하기
# 기본 카메라 객체 생성
cap = cv2.VideoCapture(0)
# 열렸는지 확인
if not cap.isOpened():
print("Camera open failed!")
sys.exit()
# 웹캠의 속성 값을 받아오기
# 정수 형태로 변환하기 위해 round
w = round(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS) # 카메라에 따라 값이 정상적, 비정상적
# fourcc 값 받아오기, *는 문자를 풀어쓰는 방식, *'DIVX' == 'D', 'I', 'V', 'X'
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
# 1프레임과 다음 프레임 사이의 간격 설정
delay = round(1000/fps)
# 웹캠으로 찰영한 영상을 저장하기
# cv2.VideoWriter 객체 생성, 기존에 받아온 속성값 입력
out = cv2.VideoWriter('output.avi', fourcc, fps, (w, h))
# 제대로 열렸는지 확인
if not out.isOpened():
print('File open failed!')
cap.release()
sys.exit()
2. 프레임 저장하기 - cv2.VideoWriter.write(image)
저장할 동영상 객체를 생성했으므로 프레임을 저장할 수 있습니다.
[명령어 설명]
cv2.VideoWriter.write(image) -> None
• image: 저장할 프레임 (numpy.ndarray)
[예시 코드]
# 프레임을 받아와서 저장하기
while True: # 무한 루프
ret, frame = cap.read() # 카메라의 ret, frame 값 받아오기
if not ret: #ret이 False면 중지
break
inversed = ~frame # 반전
edge = cv2.Canny(frame, 50, 150) # 윤곽선
# 윤곽선은 그레이스케일 영상이므로 저장이 안된다. 컬러 영상으로 변경
edge_color = cv2.cvtColor(edge, cv2.COLOR_GRAY2BGR)
out.write(edge_color) # 영상 데이터만 저장. 소리는 X
cv2.imshow('frame', frame)
cv2.imshow('inversed', inversed)
cv2.imshow('edge', edge)
if cv2.waitKey(delay) == 27: # esc를 누르면 강제 종료
break
cap.release()
out.release()
cv2.destroyAllWindows()
이처럼 웹캠으로 찰영한 영상이 저장된 것을 확인할 수 있습니다.
비디오 프레임만 저장되므로 소리는 저장되지 않습니다.
'Python > 파이썬 OpenCV 공부' 카테고리의 다른 글
[파이썬 OpenCV] 마우스를 이용해 그리기 - cv2.setMouseCallback (0) | 2020.09.27 |
---|---|
[파이썬 OpenCV] 키보드 입력으로 출력된 영상 반전 시키기 - cv2.waitkey, ord() 함수 (0) | 2020.09.27 |
[파이썬 OpenCV] 카메라와 동영상 열기, 속성값 참조, 프레임 받아오기 - cv2.VideoCapture 클래스 (11) | 2020.09.27 |
[파이썬 OpenCV] 그리기 함수 - line, rectangle, circle, polyines, putText (0) | 2020.09.25 |
[파이썬 OpenCV] 마스크 연산과 ROI - cv2.copyTo 함수 이용 방법 (0) | 2020.09.25 |