본문 바로가기
OpenCV/OpenCV-Chapter

CH10 OpenCV-Python 객체 추적(이동 평균 배경) Mean shift

by kiimy 2021. 12. 25.
728x90
728x90

정적 배경 모델 사용 시 문제점

* 미리 등록된 기준 영상이 실제 배경과 크게 달라질 경우 오동작

그림자 등의 영향으로 인한 조도변경, 새로운 객체가 화면에 고정될 경우

- 도로에 차는 잠깐 있다가 없어짐 

==> 평균을 구한 영상과 현재 Frame의 차영상을 계산하면 현재 Frame에 있는

       새로운 차들만 검출가능

움직이는 객체가 존재하는 수백 장의 입력 영상으로 부터 평균영상

== 이런 수백장의 영상을 저장한다는게 시스템쪽으로 무리가 생김(= 대용량 메모리가 필요)

     So, 이동평균 사용

 

이동 평균(Moving Average)

= WeightSum

- 수백 장의 영상을 저장하는 대신 매 프레임이 들어올 때마다 평균 영상을 갱신

- 갱신된 배경영상 = int가 아니라 미세하게 업데이트 되야하기 때문에 float

accumulateWeighted

가중치 

∝ = 0 -> 현재프레임=0, 이전 배경영상을 계속 쓰니 의미가 없다(업데이트가 안됨)

∝ = 1 -> 현재프레임을 계속 쓰겠다 이 또한 의미가 없다.

cap = cv2.VideoCapture('ch10\\videos\\PETS2000.avi')

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

# 배경 영상 등록(정적(static) 배경)
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.)
# *cv2.accumulateWeighted(gray, fback, 0.01) 연산을 위함*
fback = back.astype(np.float32) 
'''
cv2.accumulateWeighted(src, dst, alpha, mask=None) -> dst

dst: 축적영상, 입력 영상과 동일 채널개수
	32bit or 64bit float
alpha: (입력 영상에 대한)가중치
'''

while True:
    ret, frame = cap.read()

    if not ret:
        brake

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (0,0), 1.)

    # fback: float32, back: uint8 정적배경
    cv2.accumulateWeighted(gray, fback, 0.01)

    # *absdiff 연산을 위한 변환*
    back = fback.astype(np.uint8)

    diff = cv2.absdiff(gray, back)
    _, diff = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    cnt, _, stats, _ = cv2.connectedComponentsWithStats(diff)

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

        if area < 100:
            continue

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

    cv2.imshow('diff', diff)
    cv2.imshow('frame', frame)
    cv2.imshow('back', back)
    
    if cv2.waitKey(10) == ord('q'):
        break

cap.release()

정적 배경에 서서히 업데이트됨

728x90

댓글