15장. 비디오 처리와 실시간 영상처리
동영상 저장하기
녹화기로 방송을 녹화하려면 몇 가지를 미리 정해야 합니다. 어느 파일에 담을지, 어떤 방식으로 줄여 담을지, 1초에 몇 장으로 담을지, 화면 크기가 얼마인지입니다. 정한 것과 다른 화면을 넣으면 녹화가 되지 않습니다. cv2.VideoWriter 도 만들 때 이 네 가지를 받습니다.
그림의 네 상자가 cv2.VideoWriter(파일 이름, fourcc, fps, (가로, 세로), isColor) 의 인자에 차례로 맞습니다. 여기서 녹화 방식이 코덱, 그 코덱의 이름표가 fourcc 입니다. 넷째 상자의 크기와 컬러 여부는 실제로 넣을 프레임과 꼭 맞아야 합니다.
녹화기의 인자
| 인자 | 예 | 뜻 |
|---|---|---|
| 파일 이름 | "out_ch15_edges.mp4" | 확장자에 맞는 형식으로 담는다. 한글 경로는 피한다 |
| fourcc | cv2.VideoWriter_fourcc(*"mp4v") | 코덱 이름표 네 글자. *"mp4v" 는 글자 넷을 하나씩 나눠 넘긴다 |
| fps | 10 | 1초에 몇 장으로 재생되게 담을지. 보통 원본과 같게 |
| 크기 | (320, 240) | (가로, 세로) 순서. 배열의 shape 와 거꾸로다 |
| isColor | False | 흑백(채널 1) 프레임을 넣을 때 False. 기본은 True(BGR 3채널) |
import cv2
import numpy as np
# 160×120 흑백 녹화기를 만든다. 크기는 (가로, 세로) 순서다
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
writer = cv2.VideoWriter("out_ch15_demo.mp4", fourcc, 10, (160, 120), isColor=False)
print("녹화기 열림:", writer.isOpened()) # 결과: True
for k in range(20): # 흰 네모가 오른쪽으로 가는 20장
frame = np.zeros((120, 160), np.uint8) # shape 는 (세로, 가로)
cv2.rectangle(frame, (k * 6, 40), (k * 6 + 30, 80), 255, -1)
writer.write(frame)
writer.release() # 닫아야 파일이 마무리된다
check = cv2.VideoCapture("out_ch15_demo.mp4")
print("저장된 프레임 수:", int(check.get(cv2.CAP_PROP_FRAME_COUNT))) # 결과: 20
check.release()주의할 점
- 크기나 컬러 여부가 맞지 않는 프레임을
write()에 넣으면 오류 없이 조용히 빠집니다. 저장한 뒤에는 꼭 다시 열어 프레임 수를 셉니다. - 흑백 프레임은
isColor=False로 쓰거나,cv2.COLOR_GRAY2BGR로 3채널로 바꿔 씁니다. 저장한 흑백 동영상도 다시 읽으면 3채널로 읽힙니다(실습 2). release()를 부르지 않으면 파일 끝이 마무리되지 않아 재생되지 않을 수 있습니다.- mp4 는 jpg 처럼 숫자를 조금 바꿔 줄여 담습니다(2장의 jpg 화질). 0 과 255 뿐이던 이진 그림도 다시 읽으면 그 사이 값이 섞입니다.