Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 객체 추적 - 배경 차분 - MOG 배경 모델 - cv2.BackgroundSubtractor

AI 꿈나무 2020. 10. 19. 21:12
반응형

영상의 객체 추적 - 배경 차분 - MOG 배경 모델

 MOG 배경 모델을 이용해서 배경 차분을 하는 방법을 알아보겠습니다.

 

1. MOG란?

 Mixture of Gaussian, GMM(Gaussian Mixture Model)을 의미합니다.

 각 픽셀에 대해 MOG 확률 모델을 설정하여 배경과 전경을 구분하는 방법입니다.

 

 영상의 각각의 픽셀 값을 배경 영상으로 정의합니다.

 미리 정의해둔 배경 영상의 각각의 픽셀마다 가우시안 모델을 정의합니다.

 픽셀 값이 정해진된 것이 아니라 픽셀 값이 가우시안 형태를 따르는 모델로 정의하는 것입니다.

 배경 차분뿐만 아니라 데이터 사이언스에서 전반적으로 사용되는 데이터 분석 기법입니다.

 

2. 다양한 배경 모델 구성 방법

 

(1) Static scene

 static scene은 배경 영상을 고정하는 것을 의미합니다.

 

(2) Single Gaussian model

 Single Gaussian model은 픽셀마다 가우시안 모델을 정의하겠다는 의미입니다.

 노이즈를 제거하기 위해 가우시안 블러를 한번 적용한 것과 관련된 기법입니다.

 가우시안 블러를 적용해서 차영상을 구하는 것과 비슷한 형태입니다.

 

(3) Gaussian mixture model

 Gaussian mixture model은 가우시안을 여러 번 적용하는 것입니다.

 예를 들어, 나뭇잎이 바람에 흔들리게 되면 (x,y)위치가 나뭇잎과 하늘이 번갈아 나타날 수 있습니다.

 이처럼 두 개의 가우시안 배경 모델을 등록시켜 놓는 형태입니다.

 

(4) Adaptive Gaussian mixture model

 Adaptive Gaussian mixture model은 가우시안을 몇 번 적용시킬 것인지 자동으로 판단하는 프로그램입니다.

 

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

 

 기본적으로 cv2.BackgroundSubtractor 클래스가 있고 apply와 getBackgroundImage 매소드를 갖고 있습니다.

 그리고 서브 클래스로 cv2.BackgroundSubtractorKNN, cv2.BackgroundSubtractorMOG2를 갖고 있습니다.

 이 두 가지 방법은 이동 평균을 이용해서 배경을 지속적으로 update하는 방식인데 이전 포스팅에서 설명한 평균 배경 차분보다 성능이 좋습니다.

 

 이번에 공부할 배경 차분 방법은 MOG2입니다.

 

4. BackgroundSubtractorMOG2 클래스 생성 함수 - cv2.createBackgroundSubtractorMOG2

cv2.createBackgroundSubtractorMOG2(, history=None, varThreshold=None, detectShadows=None) -> dst

• history: 히스토리 길이. 기본값은 500.

• varThreshold: 픽셀과 모델 사이의 마할라노비스 거리(Mahalanobis distance) 제곱에 대한 임계값. 해당 픽셀이 배경 모델에 의해 잘 표현되는 지를 판단. 기본값은 16.

• detecShadows: 그림자 검출 여부. 기본값은 True

 histroy는 과거 몇 개의 프레임을 배경으로 이용한 것인지에 대한 인자입니다.

 

5. 전면 객체 마스크 생성 함수 - cv2.BackgroundSubtractor

cv2.BackgroundSubtractor.apply(image, fgmask=None, learningRate=None) -> fgmask

• image: (입력) 다음 비디오 프레임

• fgmask: (출력) 전경 마스크 영상. 8비트 이진 영상.

• learningRate: 배경 모델 학습 속도 지정 (0~1 사이의 실수). 기본값은 -1.
 0은 배경 모델을 갱신하지 않음
 1은 매 프레임마다 배경 모델을 새로 만듦
 -1은 자동으로 결정됨

6. 배경 영상 반환 함수 - cv2.BackgroundSubtractor.getBackgroundImage

 현재 배경 영상이 어떻게 업데이트 되고 있는지를 시각적으로 확인 가능합니다.

 

cv2.BackgroundSubtractor.getBackgroundImage(, backgroundImage=None) -> backgroundImage

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

7. MOG 기법을 이용한 배경 생성 및 전경 객체 검출 코드

 예제 코드 출처 :  황선규 박사님 github홈페이지 sunkyoo.github.io/opencv4cvml/

 

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

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

# 배경 차분 알고리즘 객체 생성
bs = cv2.createBackgroundSubtractorMOG2()
#bs = cv2.createBackgroundSubtractorKNN() # 배경영상이 업데이트 되는 형태가 다름
#bs.setDetectShadows(False) # 그림자 검출 안하면 0과 255로 구성된 마스크 출력

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

    if not ret:
        break

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

    # 0또는 128또는 255로 구성된 fgmask 생성
    fgmask = bs.apply(gray)
    # 배경 영상 받아오기
    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()
cv2.destroyAllWindows()

 

 

 

 고정객체가 배경에 업데이트 되는 모습을 확인할 수 있습니다.

 


OpenCV 튜토리얼과 황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다.

반응형