reference
이번 포스팅에서는 Computer vision에서 이미지 두 장을 이용해 depth를 추정하는 방법을 간단히 알고 가자.
Camera calibration을 통해서 우리는 3D scene을 2D image로 projection할 수 있는 projection matrix를 구할 수 있었다.
그런데, 반대로 2D image 한장을 통해서 3D scene의 point를 찾아낼 수 있을까? 아마 불가능할 것이다.
만약 우리가 하나의 카메라만 사용한다면, 직선 상의 많은 점이 내가 보는 상의 한 점에 맺히기 때문에 깊이를 구분할 수 없다.
그래도 아마 그 해당하는 3D point는 그 image plane의 2D point로부터 나가는 ray 위에 존재해야한다는 사실을 알 수 있다.
대신에 stereo depth estimation에서는 human vision과 비슷하게 2개의 view point를 통해 깊이를 추정한다.
위와 같은 setting으로 physical world의 point 를 left/right camera로 찍었다고 하자. 그러면 아래와 같이 변수를 정의할 수 있는데,
그러면, 최종적으로 Depth는 아래와 같은 수식으로 표현할 수 있다. (닮음비 이용)
여기서 알 수 있는 점은 바로 Depth가 disparity에 반비례하다는 것인데, 이 말은 disparity가 클수록 물체가 camera와 가깝다는 뜻이고, 작을수록 멀다는 뜻이다.
다음으로 나올 수 있는 질문은 이 disparity를 구하기 위해서 과 점을 어떻게 matching 시킬 수 있냐는 것인데, 이는 Template matching을 통해 이루어진다.
애초에 점 는 왼쪽 camera에서 오른쪽 camera에서 찍던 같은horizontal line 상에 위치하기 때문에, 우리는 아래 그림과 같이 left image에서 의 window를 right image에 sliding시키면서 similarity를 구해, 가장 비슷한 window와 matching시킨다.
similarity를 구하는 방법도 여러 가지가 있지만 설명은 생략.
정리하자면 stereo depth estimation에서는 두 개 이상의 카메라를 통해 얻은 영상에서 한 physical space의 한 point에 대한 disparity를 구함으로써 depth를 추정할 수 있는 것이다.
Disparity가 클수록 (빨간색) 가깝고, disparity가 작을수록 (파란색) 멀다.