Lucas-Kanade method의 이해

학술 2011. 8. 17. 14:39 Posted by 양고

http://en.wikipedia.org/wiki/Lucas%E2%80%93Kanade_method
위 문서도 요약된 것이지만 한번 더 핵심만 요약하는 것에 도전한다. 도전~!



우선 한 점의 밝기는 다음 프레임에서도 (거의) 같다는 일반적인 optical flow (이하 OF) 식은 이렇다:
I(x,y,t) = I(x + δx,y + δy,t + δt)

I(x,y,t) I(x + δx,y + δy,t + δt)를 테일러 전개하면:I(x+\delta x,y+\delta y,t+\delta t) = I(x,y,t) + \frac{\partial I}{\partial x}\delta x+\frac{\partial I}{\partial y}\delta y+\frac{\partial I}{\partial t}\delta t+고차항

고차항을 무시하면 처음 OF 식은 다음과 같이 정리된다:

\frac{\partial I}{\partial x}\delta x+\frac{\partial I}{\partial y}\delta y+\frac{\partial I}{\partial t}\delta t = 0


이 식이 일반적인 (Horn 사마 등의) dense OF 계산에 쓰이는 optical flow equation이다.
LK는 sparse OF이므로, regularization term 등을 추가하지 않고 대신 해당 픽셀 주변의 윈도를 고려한다. 윈도 내부의 점들을 q1, q2, ...라고 하고 이들에 대해 위 OF 식을 적용하면 다음과 같다:

Ix(q1)Vx + Iy(q1)Vy = − It(q1)
Ix(q2)Vx + Iy(q2)Vy = − It(q2)
\vdots
Ix(qn)Vx + Iy(qn)Vy = − It(qn)

이를 Av = b 행렬 형태로 나타내면:

A = \begin{bmatrix}
I_x(q_1) & I_y(q_1) \\[10pt]
I_x(q_2) & I_y(q_2) \\[10pt]
\vdots  & \vdots  \\[10pt]
I_x(q_n) & I_y(q_n) 
\end{bmatrix},
\quad\quad
v = 
\begin{bmatrix}
V_x\\[10pt]
V_y
\end{bmatrix},
\quad \mbox{and}\quad
b = 
\begin{bmatrix}
-I_t(q_1)\\ [10pt]
-I_t(q_2)\\ [10pt]
\vdots \\[10pt]
-I_t(q_n)
\end{bmatrix}

한 점의 OF 벡터(Vx,Vy)를 알고자 하는데 윈도에 포함된 점 갯수만큼의 수식이 생겼으니 over-determined이다. 미지수인 v에 대해 풀기 위해서 일단 AT를 앞에 곱해서 v 앞에 붙은 것들을 정방행렬로 만들자 (정방행렬은 almost surely 역행렬을 가진다고 한다). 그러면 다음의 2×2 시스템이 된다:

ATAv = ATb
v = (ATA) − 1ATb
\begin{bmatrix}
V_x\\[10pt]
V_y
\end{bmatrix} 
=
\begin{bmatrix}
\sum_i I_x(q_i)^2      & \sum_i I_x(q_i)I_y(q_i) \\[10pt]
\sum_i I_x(q_i)I_y(q_i) & \sum_i I_y(q_i)^2 
\end{bmatrix}^{-1}
\begin{bmatrix}
-\sum_i I_x(q_i)I_t(q_i) \\[10pt]
-\sum_i I_y(q_i)I_t(q_i)
\end{bmatrix}

그러면 Vx, Vy를 구했다. 만세!
윈도 내에서 가중치를 주고 싶으면 다음과 같이 된다(고 한다):

ATWAv = ATWb
v = (ATWA) − 1ATWb
\begin{bmatrix}
V_x\\[10pt]
V_y
\end{bmatrix} 
=
\begin{bmatrix}
\sum_i w_i I_x(q_i)^2      & \sum_i w_i I_x(q_i)I_y(q_i) \\[10pt]
\sum_i w_i I_x(q_i)I_y(q_i) & \sum_i w_i I_y(q_i)^2      
\end{bmatrix}^{-1}
\begin{bmatrix}
-\sum_i w_i I_x(q_i)I_t(q_i) \\[10pt]
-\sum_i w_i I_y(q_i)I_t(q_i)
\end{bmatrix}

여기까지가 기본이고, 자세한 것은 81년도의(무려 신군부 시절) Lucas 논문을 보면 되겠다.
음 요약한다고 했는데 결국 위키피디아 설명에서 중요 부분만 발췌하는 수준에서 끝났다.
어쨌든 기본 내용만 알면 되지 않겠음? 전혀 모르고도 OpenCV에서 잘만 가져다 쓰는데...



[2012.1.9 추가]
컬러로도 위 식을 적용할 수 있을 것이다.
그런데 실제로 opencv에서 컬러 이미지를 넣어보면 미친듯이 느린데다 결과도 거지같다. 왜 그런지는 모르겠다...!