움직임 추적(motion tracking)
움직임 추적에서 보통 많이 사용하는 mean-shift와 cam-shift에 대해 정리해본다.
1. mean-shift(민시프트)
mean-shift 알고리즘은 데이터 집합의 밀도 분포에서 지역 극값(local extrema)을 찾아내는 방법이다.
언덕오르기 알고리즘과 비슷한 방법으로 생각할 수 있다.
데이터 집합이 있을때 보통 mean-shift는 데이터의 이상치(outlier)를 무시한다. 쉽게 말하면 데이터의
정점(peak)으로부터 너무 멀리 떨어진 데이터는 무시한다는 것을 의미한다.
따라서 특정 지역내의 윈도우 안에 존재하는 데이터 점들만을 사용하여 윈도우를 움직인다.
mean-shift 알고리즘은 다음과 같이 동작한다.
1. 탐색 윈도우내의 데이터들로 무게중심(center of mass)를 구한다. 2. 윈도우의 중심을 무게 중심 위치로 옮긴다. 3. 윈도우가 움직임을 멈출 때까지 2번 단계부터 반복한다. |
보통 윈도우 내의 데이터들로 부터 무게중심을 구할때 가우시안 분포(Gaussian distribution)을 사용한다.
보통 중심으로 부터 가까이 있는 데이터에 가중치를 좀더 높여 주는 방식이 좋다.
위 그림은 mean-shift 알고리즘의 이동 분포를 표현한 것이다. 사진을 보면 데이터의 중심(많은 픽셀이 분포한 점)
으로 윈도우가 이동하는것을 확인할 수 있다.
mean-shift알고리즘은 지역적 정점을 찾기 때문에 여러 지점에서 정점이 발견 될 수도 있다.
이런 움직임으로 인하여 윈도우 아래 존재하는 데이터들이 바뀌게 되고, 반복적으로 중심 이동 작업을 수행할
수행할 수 있다. 중심 이동이 반복되면 mean-shift 벡터가 0이 되는 경우가 생기면 이때 수렴하는 순간이라고
판단하면 된다.
OpenCV는 mean-shift 함수를 제공한다.
1 | int meanShift(InputArray probImage, Rect& window, TermCriteria criteria) | cs |
probImage는 역투영 히스토그램 이미지를 입력으로 받는다. calcBackProject()함수를 이용하면 된다.
window는 커널 윈도우 초기위치, 크기를 나타낸다. criteria는 반복연산의 종료조건을 입력하면 된다.
2. camshift(캠시프트)
[Bradski98] Bradski, Gary R. "Computer vision face tracking for use in a perceptual user interface." (1998).
예를 들어 얼굴 특징을 이용하여 추적하는 경우, 카메라로부터 사람이 가까워지거나 멀어짐에
따라 얼굴 크기에 맞게 자동으로 윈도우 크기를 변화시킨다.
1 | RotatedRect CamShift(InputArray probImage, Rect& window, TermCriteria criteria) | cs |
mean shift와 cam shift 알고리즘은 색상 특징값을 이용하는 추적 알고리즘이라고 생각하기 쉬운데,
이 생각은 잘못된 생각일 수 있다. 이 두 알고리즘은 확률적 분포에서 표현되는 모든 종류의 특징 분포를 추적한다.