OpenCV 비전 실무15장 · 비디오 처리와 실시간 영상처리7 / 22← 이전목차다음 →MetaContents

15장. 비디오 처리와 실시간 영상처리

동영상 저장하기

녹화기로 방송을 녹화하려면 몇 가지를 미리 정해야 합니다. 어느 파일에 담을지, 어떤 방식으로 줄여 담을지, 1초에 몇 장으로 담을지, 화면 크기가 얼마인지입니다. 정한 것과 다른 화면을 넣으면 녹화가 되지 않습니다. cv2.VideoWriter 도 만들 때 이 네 가지를 받습니다.

파일 이름, fourcc, fps, 크기·컬러의 네 가지 정할 것을 나란히 놓은 비교 그림

그림의 네 상자가 cv2.VideoWriter(파일 이름, fourcc, fps, (가로, 세로), isColor) 의 인자에 차례로 맞습니다. 여기서 녹화 방식이 코덱, 그 코덱의 이름표가 fourcc 입니다. 넷째 상자의 크기와 컬러 여부는 실제로 넣을 프레임과 꼭 맞아야 합니다.

녹화기의 인자

인자예뜻
파일 이름"out_ch15_edges.mp4"확장자에 맞는 형식으로 담는다. 한글 경로는 피한다
fourcccv2.VideoWriter_fourcc(*"mp4v")코덱 이름표 네 글자. *"mp4v" 는 글자 넷을 하나씩 나눠 넘긴다
fps101초에 몇 장으로 재생되게 담을지. 보통 원본과 같게
크기(320, 240)(가로, 세로) 순서. 배열의 shape 와 거꾸로다
isColorFalse흑백(채널 1) 프레임을 넣을 때 False. 기본은 True(BGR 3채널)
Python
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 뿐이던 이진 그림도 다시 읽으면 그 사이 값이 섞입니다.
← 이전 절15장 · 프레임마다 처리하기다음 절 →15장 · 프레임 차이로 움직임 찾기