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

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

배경 빼기

매일 같은 시간에 같은 자리에서 교실 사진을 찍는다고 해 봅시다. 수업이 없는 아침의 빈 교실 사진을 한 장 남겨 두면, 나중에 찍은 사진에서 빈 교실 사진을 빼서 "그 사이에 들어온 것"만 골라낼 수 있습니다. 배경 빼기는 이 빈 교실 사진, 곧 배경을 기억해 두는 방법입니다.

앞뒤 프레임을 빼는 프레임 차이, 중앙값으로 배경을 만드는 방법, 배경을 스스로 배우는 MOG2 를 나란히 놓은 비교 그림

그림은 움직임을 찾는 세 가지 길입니다. 가운데의 중앙값 배경은 여러 프레임을 겹쳐 칸마다 가운데 밝기를 고른 것입니다. 오른쪽의 MOG2 는 프레임이 들어올 때마다 배경을 조금씩 고쳐 배웁니다. 여기서 빈 교실 사진이 배경이고, 그 사이에 들어온 것이 전경입니다. 비유와 다른 점은 빈 교실 사진을 따로 찍지 않아도 된다는 것입니다. 물체가 잠깐씩만 지나가면 여러 프레임에서 배경을 계산해 낼 수 있습니다.

왜 평균이 아니라 중앙값일까

한 칸이 다섯 프레임 동안 100, 100, 200, 100, 100 이었다고 합시다. 셋째 장에서만 밝은 물체가 지나갔습니다.

계산식결과
평균(100 + 100 + 200 + 100 + 100) ÷ 5120 → 물체가 흐릿하게 남는다
중앙값줄 세우면 100, 100, 100, 100, 200 의 가운데100 → 물체가 지워진다
Python
import numpy as np

# 한 칸의 다섯 프레임 밝기. 셋째 장에서만 물체가 지나갔다
pixel = np.array([100, 100, 200, 100, 100])
print("평균:", float(np.mean(pixel)))       # 결과: 120.0
print("중앙값:", float(np.median(pixel)))   # 결과: 100.0

# 프레임 여러 장을 쌓아 칸마다 중앙값을 내면 배경 그림이 된다
frames = np.stack([np.full((2, 2), v, np.uint8) for v in pixel])   # 모양 (5, 2, 2)
background = np.median(frames, axis=0).astype(np.uint8)            # axis=0: 프레임 방향으로
print(background)                          # 결과: 모든 칸이 100

세 방법 견주기

견줄 것프레임 차이중앙값 배경MOG2
기억하는 것바로 앞 프레임 하나미리 계산한 배경 한 장칸마다 자주 나오는 밝기 몇 개
멈춘 물체사라진다남는다오래 멈추면 배경으로 배운다
물체 모양테두리 쪽만통째로통째로
시작할 때둘째 프레임부터 된다프레임을 여러 장 모은 뒤처음 몇 프레임은 배우는 중이라 지저분하다
조명이 바뀌면강하다약하다(배경을 다시 만든다)천천히 따라간다

cv2.createBackgroundSubtractorMOG2(history=30, varThreshold=25, detectShadows=False) 로 만들고 프레임마다 .apply(frame) 을 부르면 전경 마스크(전경 255, 배경 0)를 돌려줍니다. history 는 최근 몇 프레임을 기억할지, varThreshold 는 "자주 나오는 밝기에서 얼마나 벗어나면 전경인가"의 기준(variance threshold, 퍼짐 정도의 기준값)이고, detectShadows 는 그림자를 따로 표시할지입니다.

마당 동영상의 중앙값 배경, 35번 프레임에 상자를 그린 결과, MOG2 의 0번과 35번 전경 마스크를 놓은 그림

그림의 첫째 칸은 60장에서 칸마다 중앙값을 낸 배경으로, 공과 수레가 지워졌습니다. 둘째 칸은 35번 프레임에서 배경을 빼고 이진화한 뒤 12장에서 본 cv2.findContours(흰 덩어리의 테두리, 곧 윤곽선 찾기)와 cv2.boundingRect(윤곽선을 꼭 맞게 감싸는 네모)로 다홍 상자를 그린 것입니다. 셋째 칸은 MOG2 의 0번 프레임 결과로, 아직 배운 배경이 없어 화면 전체가 흰색(전경)입니다. 넷째 칸은 같은 MOG2 가 35번 프레임에서 잡은 전경으로, 공과 수레를 잡았지만 가장자리가 거칩니다.

주의할 점

  • MOG2 는 처음 몇 프레임 동안 배경을 배웁니다. 이 동안의 결과는 버리거나, 물체가 없는 프레임부터 넣습니다. 배경이 고른 이 장의 마당 동영상에서는 첫 장 하나로 끝났지만, 배경이 복잡하거나 흔들리면 더 오래 걸립니다.
  • 중앙값 배경은 물체가 프레임의 절반 넘게 같은 자리에 있으면 그 물체를 배경으로 삼습니다. 오래 서 있는 물체가 있으면 쓸 수 없습니다.
  • 그림자, 흔들리는 나뭇잎, 조명의 깜빡임도 전경으로 잡힙니다. 넓이가 작은 덩어리는 버리는 기준을 함께 둡니다.
← 이전 절15장 · 프레임 차이로 움직임 찾기다음 절 →15장 · 실시간 처리와 처리 시간