Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 객체 추적 - 정적 배경 차분 방법 - cv2.absdiff 함수

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

영상의 객체 추적 - 정적 배경 차분 방법

 배경 차분(Background Subtraction : BS)은 등록된 배경 모델과 현재 입력 프레임과의 차영상을 이용하여 전경 객체를 검출하는 방법입니다.

 동영상에서 움직이는 전경 객체 검출을 위한 기본적인 방법입니다. 

 

 배경 영상을 model이라는 용어를 써서 배경 영상을 등록시켜두고 배경 영상과 다른 부븐을 찾아서 그 부분이 새로 나타난 객체라고 판단하는 방식으로 작동합니다.

 배경과 현재 프레임의 차이가 있는 부분을 검출하게 됩니다.

 

 

출처 : OpenCV 튜토리얼

 

정적 배경을 이용한 전경 객체 검출 예제 코드

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

 

 배경 영상과 현재 프레임 영상의 차이를 구하기 위해 cv2.absdiff 함수를 이용합니다,

 

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

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

# 배경 영상 등록
ret, back = cap.read()

if not ret:
    print('Background image registration failed!')
    sys.exit()
    
# 연산 속도를 높이기 위해 그레이스케일 영상으로 변환
back = cv2.cvtColor(back, cv2.COLOR_BGR2GRAY)

# 가우시안 블러로 노이즈 제거 (모폴로지, 열기, 닫기 연산도 가능)
back = cv2.GaussianBlur(back, (0, 0), 1.0)

# 비디오 매 프레임 처리
while True:
    ret, frame = cap.read()
    
    if not ret
        break
    
    # 현재 프레임 영상 그레이스케일 변환
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 노이즈 제거
    gray = cv2.GaussianBlur(gray, (0, 0), 1.0)
    
    # 차영상 구하기 $ 이진화
    # absdiff는 차 영상에 절대값
    diff = cv2.absdiff(gray, back)
    # 차이가 30이상 255(흰색), 30보다 작으면 0(검정색)
    _, diff = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
    
    # 레이브링을 이용하여 바운딩 박스 표시
    cnt, _, stats, _ = cv2.connectedComponentsWithStats(diff)
    
    for i in range(1, cnt):
        x, y, w, h, s = stats[i]
        
        if s < 100:
            continue
            
        cv2.rectangle(frame, (x, y, w, h), (0, 0, 255), 2)
    
    cv2.imshow('frame', frame)
    cv2.imshow('diff', diff)

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

cap.release()
cv2.destroyAllWindows()




 

 

 빨강색 자동차는 기존의 배경 영상에 없던 자동차입니다.

 이처럼 정적 배경 차분 방법을 이용하면 등록해두었던 배경영상에 없던 객체가 나타났을 때 그 객체를 추적할 수 있습니다.

 


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

 

OpenCV: How to Use Background Subtraction Methods

Next Tutorial: Meanshift and Camshift Background subtraction (BS) is a common and widely used technique for generating a foreground mask (namely, a binary image containing the pixels belonging to moving objects in the scene) by using static cameras. As the

docs.opencv.org

 

반응형