Computer Vision/opencv(python)

[65] 3) 배경 차분 : MOG 배경 모델

jwjwvison 2021. 3. 28. 14:27
  • MOG 란?
    • Minture of Gaussian, GMM(Gaussian Mixture Mode)
    • 각 픽셀에 대해 MOG 확률 모델을 설정하여 배경과 전경을 구분

 

  • 다양한 배경 모델 구성 방법

 

  • OpenCV 에서 제공하는 배경 추정 알고리즘

 

  • BackgroundSubtractorMOG2 클래스 생성 함수
cv2.createBackgroundSubtractorMOG2(history=None, varThreshold=None, detectShadows=None) -> dst

 • history: 히스토리 길이 . 기본값은 500.
 • varThreshold : 픽셀과 모델 사이의 마할라노비스 거리 (Mahalanobis distance) 제곱에 대한 임계값 . 해당 픽셀이 배경 모델에 의해 잘 표현되는 지를 판단 . 기본값은 16.
 • detecShadows : 그림자 검출 여부 . 기본값은 True.

 

  • 전면 객체 마스크 생성 함수
cv2.BackgroundSubtractor.apply(image,fgmask=None,learningRate=None) -> fgmask

 • image: (입력) 다음 비디오 프레임
 • fgmask: (출력) 전경 마스크 영상 . 8 비트 이진 영상
 • learningRate: 배경 모델 학습 속도 지정 (0~1 사이의 실수 ). 기본값은 -1.

 

  • 배경 영상 반환 함수
cv2.BackgroundSubtractor.getBackgroundImage(background=None) -> backgroundImage

 • backgroundImage : (출력) 학습된 배경 영상

 

  • MOG 기법을 이용한 배경 생성 및 전경 객체 검출
import sys
import numpy as np
import cv2


# 비디오 파일 열기
cap = cv2.VideoCapture('PETS2000.avi')

if not cap.isOpened():
    print('Video open failed!')
    sys.exit()

# 배경 차분 알고리즘 객체 생성  어떤 방법이 더 좋은지는 영상에 따르다
bs=cv2.createBackgroundSubtractorMOG2()
#bs=cv2.createBackgroundSubtractorKNN()
bs.setDetectShadows(False)

# 비디오 매 프레임 처리
while True:
    ret,frame=cap.read()

    if not ret:
        break

    gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

    fgmask=bs.apply(gray)    #0또는 128또는 255 세개의 픽셀값으로 구성되어있는 영상형태로 return
                             #그림자를 찾으면 128이 들어가고 찾지 않으면 들어가지 않는다
    back=bs.getBackgroundImage()

    #레이블링을 이용하여 바운딩 박스 표시
    cnt,_,stats,_=cv2.connectedComponentsWithStats(fgmask)

    for i in range(1,cnt):
        x,y,w,h,s=stats[i]

        if s<80:
            continue

        cv2.rectangle(frame,(x,y,w,h),(0,0,255),2)

    cv2.imshow('frame',frame)
    cv2.imshow('back',back)
    cv2.imshow('fgmask',fgmask)

    if cv2.waitKey(20)==27:
        break

cap.release()