optical flow with opencv python 연습
기본적인 전제는 동영상이 한 프레임에서 다음 프레임으로 넘어갈 때 pixel intensity 가 빠르게 변하지 않는다는 것이다. 그렇기에 물론 지나치게 빠르게 이동하는 물체는 잡아내기 힘들다. 사실 지나칠 것까지도 없고 슝- 하는 정도기만 해도 못잡지만... 그러므로 기본 등식을 다음과 같이 쓸 수 있다. I(x, y, t) = I(x + dx, y + dy, t + dt) 시간에 따라 x, y 좌표가 살짝씩 움직여도 intensity 즉 명도에는 차이가 없다는 뜻이다. 우변을 테일러 전개로 풀어주면 다음과 같이 된다. I(x + dx, y + dy, t + dt) = I(x) + dx* dI/dx +I(y) + dy * dI/dy + I(z) + dt* dI/dt 그러면 좌변에서 소거해 줄 수 있고, 남는 식은 이것 뿐이다. dx* dI/dx + dy* dI/dy + dt* dI/dt = 0 좌변을 dt로 나누고 Intensity function I 의 dI/dx, dI/dy, dI/dt를 알아보기 쉽게 f_x, f_y, f_t로 바꿔주자(진작부터 f로 할걸...) dx/dt *f_x + dy/dt * f_y + f_t = 0 마지막으로 dx/dt, dy/dt를 u, v로 치환해주면 optical flow equation 완성! u*f_x + v*f_y + f_t = 0 여기서 f_x와 f_y는 한 프레임 내에서 이미지의 명도가 어떻게 변하는지 확인하면 구할 수 있는 변수이고, f_t 역시 프레임이 다음 프레임으로 넘어갈 때 명도가 어떻게 변하는지 확인하면 구할 수 있다. 그러므로 총 미지수는 u, v 로 두 개이다. u와 v는 x,y가 시간에 따라 어떻게 변하는지에 대한 변수이므로, '속도'라고 보면 되겠지? 어쨌든 변수는 두 개, 방정식은 하나이므로 식을 하나 더 만들어야 한다. 그건 Lucas Kanade Method를 사용해서 세워줄 수 있다. 3x3 행렬을 사용하여 픽셀의...