1. 평균 이동(Mean shift) 알고리즘이란
A non-parametric feature-space analysis technique for locating the maxima of a density
function
국지적평균을탐색하면서이동 • 모드 검출(mode seeking) 알고리즘
Mean shift OpenCV 함수 프로토타입
cv2.meanShift(probImage, window, criteria) -> retval, window
• probImage: 관심 객체에 대한 히스토그램 역투영 영상 (확률 영상)
• window: 초기검색영역윈도우&결과영역반환
• criteria: 알고리즘 종료 기준
• retval: 알고리즘 내부 반복 횟수.
프로그램 동작 방식
1) 추적할 객체를 등록
▪첫번째프레임에서추적할객체의위치를지정
▪ HSV 색 공간에서 HS 히스토그램을 구함
2)평균 이동 추적
▪ 매 프레임마다 히스토그램 역투영을 수행
▪ 여기에 평균 이동 알고리즘을 적용하여 객체를 추적!
2. CamShift 알고리즘 이란?
-
Continuously Adaptive Mean Shift
-
추적하는객체의크기가변하더라도검색윈도우의크기가고정되어있는 평균 이동 알고리즘의 단점을 보완
-
캠시프트동작방법
• 우선 평균이동알고리즘으로 이동위치계산
• 윈도우크기를조정
• 특징공간을 가장 잘 표현하는 타원 검출
• 새로운 크기의 윈도우를 이용하여 다시 평균이동 수행
CamShift OpenCV 함수 프로토타입
cv2.CamShift(probImage, window, criteria) -> retval, window
• probImage: 관심 객체에 대한 히스토그램 역투영 영상 (확률 영상)
• window: 초기검색영역윈도우&결과영역반환
• criteria: 알고리즘종료기준.(type,maxCount,epsilon) 튜플.
▪ (e.g.) term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)
➔ 최대 10번 반복하며, 정확도가 1이하이면 (즉, 이동 크기가 1픽셀보다 작으면) 종료.
• retval: 추적하는 객체의 모양을 나타내는 회전된 사각형 정보를 반환. ((cx, cy), (width, height), angle) 튜플.
파이썬 코드 예제
#비디오 매 프레임 처리
while True:
ret, frame = cap.read()
# HS 히스토그램에 대한 역투영
frame_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
backproj = cv2.calcBackProject([frame_hsv], channels, hist, ranges, 1)
# CamShift
ret, rc = cv2.CamShift(backproj, rc, term_crit)
# 추적 결과 화면 출력
cv2.rectangle(frame, rc, (0, 0, 255), 2)
cv2.ellipse(frame, ret, (0, 255, 0), 2)
cv2.imshow('frame', frame)
실제 테스트를 해 보면 알겠지만 camshift의 경우 크기, 회전 변화를 추적할 수 있으며 특히 사람 얼굴을 추적하는데에 매우 뛰어난 성능을 보입니다. 하지만 camshift는 물체가 단일색일 경우 그리고 배경과 구분되는 색일 경우의 성능은 매우 뛰어나지만 물체에 여러 색상이 섞여있거나 배경과 유사한 색일 경우에는 오히려 meanshift보다 성능이 떨어집니다
meanshift나 camshift 모두 색상 히스토그램을 이용한 추적 방식이기 때문에 이에 따른 장단점은 명확합니다. 히스토그램의 특성상 위치정보는 고려하지 않기 때문에 물체의 형태가 변해도 추적이 가능한 반면, 다른 한편으로는 색이 배치된 위치정보를 잃어버리기 때문에 물체의 색 구성이 배경과 유사한 경우에는 추적에 실패하기 쉽습니다.
결론적으로 meanshift/camshift 등은 단순한 환경(공장자동화 응용, 배경도 단색, 물체도 단색)에서는 최고의 tracker이지만 일반적인 환경에서는 거의 적용이 힘들다고 볼 수 있습니다.