가우시안 믹스쳐 기반의 배경/전경 분할 알고리즘 (An Improved Adaptive Background Mixture Model for Realtime Tracking with Shadow Detectio)
K값이 3 or 5인 가우시안 분포 믹스쳐를 배경 픽셀에 적용함으로써 배경 제거를 수행한다.
믹스쳐에 대한 가중치는 영상에서 배경 제거를 위한 특정 픽셀이 동일한 장소에 머물고 있는 시간 비율을 나타낸다.
BackgroundSubtractorMOG와 마찬가지로 가우시안 믹스쳐 기반 배경/전경 분할 알고리즘이다.
이 알고리즘의 중요 특징은 각 픽셀에 적절한 가우시안 분포값을 선택한다는 것이다.
BackgroundSubtractorMOG와 차이점은 조명 상태의 변화로 장면이 변하더라도 제대로 배경제거를 해준다.
통계적 배경 이미지 제거와 픽셀 단위 Bayesian segmentation을 결합한 알고리즘
GMG 알고리즘은 최초 몇 frame(보통 120 frame)을 배경 모델링을 위해 사용하며, 배경이 아닌 전경이나 움직이는 객체를 추출하기 위해 Bayesian inference을 이용한다.
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)
아래와 같은 에러가 발생했을 때 해결 방법
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
일반적으로 INTER_LINEAR 이 가장 많이 사용된다.
이미지를 확대 하는 경우, INTER_CUBIC, INTER_LINEAR 을 가장 많이 사용한다.
이미지를 축소 하는 경우, INTER_AREA 을 가장 많이 사용한다.
INTER_AREA 에서 이밎지를 확대 하는 경우, INTER_NEAREST 와 비슷한 결과를 반환한다.