background subtraction(배경 제거)

배현성·2022년 11월 20일
0
post-thumbnail

1. Overivew


  • 많은 종류의 비전 기반 어플리케이션에서 활용되는 주된 전처리 프로세싱 과정이다.
  • ex) 출입구에 설치된 CCTV와 같은 고정된 카메라를 이용해서 출입하는 방문객 수를 계산하는 프로그램이나 교통량 조사를 위한 카메라에 탑재되어 있는 프로그램에서 배경제거 기법을 활용한다.
    • 기술적으로 배경제거는 정지된 부분에서 움직이는 부분만 추출하면 가능하다.
    • 고정된 카메라의 경우 배경 == 움직이지 않는 정지 영상, 움직이는 사람 or 물체 == 움직이는 객체
  • OpenCV는 배경제거를 편리하게 해주는 3가지 알고리즘을 지원한다.
    • BackgroundSubtractorMOG
    • BackgroundSubtractorMOG2
    • BackgroudSubtractorGMG

2. Background Subtractor

2.1 BackgroundSubtractorMOG

가우시안 믹스쳐 기반의 배경/전경 분할 알고리즘 (An Improved Adaptive Background Mixture Model for Realtime Tracking with Shadow Detectio)

K값이 3 or 5인 가우시안 분포 믹스쳐를 배경 픽셀에 적용함으로써 배경 제거를 수행한다.
믹스쳐에 대한 가중치는 영상에서 배경 제거를 위한 특정 픽셀이 동일한 장소에 머물고 있는 시간 비율을 나타낸다.

2.2 BackgroundSubtractorMOG2

BackgroundSubtractorMOG와 마찬가지로 가우시안 믹스쳐 기반 배경/전경 분할 알고리즘이다.
이 알고리즘의 중요 특징은 각 픽셀에 적절한 가우시안 분포값을 선택한다는 것이다.
BackgroundSubtractorMOG와 차이점은 조명 상태의 변화로 장면이 변하더라도 제대로 배경제거를 해준다.

2.3 BackgroudSubtractorGMG

통계적 배경 이미지 제거와 픽셀 단위 Bayesian segmentation을 결합한 알고리즘

GMG 알고리즘은 최초 몇 frame(보통 120 frame)을 배경 모델링을 위해 사용하며, 배경이 아닌 전경이나 움직이는 객체를 추출하기 위해 Bayesian inference을 이용한다.

3 Test

3.1 test code

import cv2
import numpy as np
import argparse

def background_subtractor(img_path):

  src = cv2.VideoCapture(img_path)

	# Subtractors
  mogSubtractor = cv2.bgsegm.createBackgroundSubtractorMOG(300)
  mog2Subtractor = cv2.createBackgroundSubtractorMOG2(300, 400, True)
  gmgSubtractor = cv2.bgsegm.createBackgroundSubtractorGMG(10, .8)
  knnSubtractor = cv2.createBackgroundSubtractorKNN(100, 400, True)
  cntSubtractor = cv2.bgsegm.createBackgroundSubtractorCNT(5, True)

  while(1):

    ret, frame = src.read()

    if not ret:
      print("There is no frame!\n")
      break
    resized_frame = cv2.resize(frame, dsize=(1280, 640), interpolation=cv2.INTER_CUBIC)
    #resized_frame = cv2.resize(frame, (0, 0), fx=0.375, fy=0.25)

		# Get the foreground masks using all of the subtractors
    mogMask = mogSubtractor.apply(resized_frame)
    mog2Mmask = mog2Subtractor.apply(resized_frame)
    gmgMask = gmgSubtractor.apply(resized_frame)
    gmgMask = cv2.morphologyEx(gmgMask, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3)))
    knnMask = knnSubtractor.apply(resized_frame)
    cntMask = cntSubtractor.apply(resized_frame)

    # Count all the non zero pixels within the masks
    mogCount = np.count_nonzero(mogMask)
    mog2MCount = np.count_nonzero(mog2Mmask)
    gmgCount = np.count_nonzero(gmgMask)
    knnCount = np.count_nonzero(knnMask)
    cntCount = np.count_nonzero(cntMask)

    cv2.imshow('Original', resized_frame)
    cv2.imshow('MOG', mogMask)
    cv2.imshow('MOG2', mog2Mmask)
    cv2.imshow('GMG', gmgMask)
    cv2.imshow('KNN', knnMask)
    cv2.imshow('CNT', cntMask)

    k = cv2.waitKey(0) & 0xff
    if k == 27: # esc key
      break


if __name__ == "__main__":
  parser = argparse.ArgumentParser(description="please input image path for background subtraction")
  parser.add_argument("--img_path", type=str, dest="img_path", default="./sample_data/sample_image_1.png", help="input image path")
  args = parser.parse_args()

  background_subtractor(args.img_path)

test output


4. 결론

  • MOG, MOG2, GMG aglrothim들은 정지 영상에서 움직이는 물체를 추출하기 위한 알고리즘으로 정지 영상 & 정지 물체인 이미지에서 사용하기에는 부적절해 보인다.

5. 참고


5.1 OpenCV 에러

아래와 같은 에러가 발생했을 때 해결 방법

Traceback (most recent call last):
  File "background_subtractor.py", line 27, in <module>
    background_subtractor(args.img_path)
  File "background_subtractor.py", line 9, in background_subtractor
    mogSubtractor = cv2.bgsegm.createBackgroundSubtractorMOG(300)
AttributeError: module 'cv2' has no attribute 'bgsegm'

$ pip install opencv-contrib-python

5.2 image resize시 참고사항


일반적으로 INTER_LINEAR 이 가장 많이 사용된다.
이미지를 확대 하는 경우, INTER_CUBIC, INTER_LINEAR 을 가장 많이 사용한다.
이미지를 축소 하는 경우, INTER_AREA 을 가장 많이 사용한다.
INTER_AREA 에서 이밎지를 확대 하는 경우, INTER_NEAREST 와 비슷한 결과를 반환한다.

profile
platform optimazation engineer

0개의 댓글