OpenCV Optical Flow

seokj·2023년 1월 24일
0
post-thumbnail

Optical Flow는 영상에서 물체의 움직임을 감지하는 이미지 처리 기술이다. 움직임을 인지하는데에 도움이 되지 않을까 해서 데이콘 컴피티션의 데이터 전처리로 사용하기 위해 공부해보았다.


참고자료:
https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html


Optical Flow는 물체의 움직임을 2차원 벡터로 나타낸다. I(x,y,t)의 점이 I(x+dx, y+dy, t+dt)로 이동했을 경우 테일러 급수를 통해 다음과 같이 나타낼 수 있는데 (fx, fy)가 Optical Flow의 결과가 된다.

하지만 (u, v)도 모르는 변수이기 때문에 1개의 방정식으로 2개의 변수를 풀 수 없는 상황이 된다. 이 때 많이 쓰이는 Lucas Kanade method은 하나의 픽셀의 주변 픽셀도 모두 같은 움직임을 할 것이라 가정한다. 그러면 인접한 8픽셀을 합쳐 9개의 방정식으로 2개의 변수를 푸는 문제로 놓을 수 있고 Least Square Fit method를 통해 (fx, fy)를 구할 수 있다.

이러면 작은 픽셀의 움직임만 구할 수 있기 때문에 피라미드 계층의 형태로 점점 넓은 픽셀을 통해 움직임을 분석하여 큰 물체의 움직임도 잡아낼 수 있다.

OpenCV에서 앞서 설명한 내용을 구현한 cv.calcOpticalFlowPyrLK 함수를 이용하여 아래와 같은 이미지를 얻을 수 있다. 한 점에 대한 Optical Flow를 구할 수 있는 함수라서 Shi-Tomasi corner detection으로 첫 프레임의 모서리를 추출하여 적용한 모습이다. 모서리 추출은 cv.goodFeaturesToTrack로 구현되어있다.


Gunnar Farneback's algorithm을 통해 전체 이미지의 Optical Flow를 구할 수 있다. 결과는 아래와 같다. 벡터의 방향을 색상에, 크기를 명도에 적용한 이미지이다. cv.calcOpticalFlowFarneback으로 구현되어있다.

profile
안녕하세요

0개의 댓글