먼저 해당 포스트를 쓰기 전에 저번 포스트에서 다루었던, 내용 중 Camera Calibration에 관련된 내용을 다루지는 않았지만, 이와 관련된 내용(Zhang's method)이 고영민 교수님의 Velog 상에 올라와 있어서 관심있는 사람은 찾아보길 바란다.
개인적으로 해당 Velog는 고영민 교수님의 수업이 어렵다고 느끼는 학우들이 많아서 이를 쉽게 설명해보고자 만드는 것이 목적이므로, 단순히 증명이 많은 내용은 생략했다. 간략하게 설명하자면, Calibration은 Camera Paramete를 찾는 방법이다. Camera를 구매하였을 때, 초점거리 혹은 image plane의 원점을 알려주지 않기 때문에 이를 찾을 수 있는 방법을 기술하는 것으로 Image간의 matching되는 point를 쉽게 구하기 위해서 Checker board를 활용하게 된다. Homography에서 다루었던 DLT과정을 통해서 수행하며, SVD(Singular Value Decomposition) 과정을 통해서 Least Square문제를 해결하는 과정이 담겨 있다. 또한,Zhang's method를 통해서 Instrinsic Parameter를 구하는 과정을 설명한다. 관심이 있다면 꼭 찾아보길 바란다. Linear Algebra를 수강했다면 수식 자체가 어렵지는 않다.
https://velog.io/@koyeongmin/%EA%B8%B0%EC%B4%88-%EC%BB%B4%ED%93%A8%ED%84%B0-%EB%B9%84%EC%A0%84-4-Calibration
다시 본론으로 돌아와서 지난 포스트에서 Camera Parameter를 포함하는 투영행렬의 Inverse matrix로는 3차원 상의 point를 복원할 수 없다고 하였다. 따라서 3차원 정보를 복원하기 위해서는 추가적인 정보가 필요한데, 해당 정보가 바로 Depth이다. 이번 포스트에서는 Depth Estimation의 방법으로 Stereo Matching에 관련해서 설명하고자 한다.
방금 전 설명하였듯이, 3차원 정보를 복원하기 위해서는 Depth를 알아야 하는데, 이를 Estimation하기 위해서는 Stereo Camera를 활용하거나 여러 장의 연속된 Image 집합을 모아야 한다. 즉, 2장 이상의 Image가 있어야 3차원 정보 복원이 가능하다.
그렇다면 어떻게 Depth를 추정할 수 있는지에 대한 아이디어를 살펴보자.

지난 Post에서 설명하였듯이, 1대의 Camera에서 투영과정을 역으로 수행하면 1개의 직선이 나온다는 사실을 알 수 있었다. 따라서 위와 같이 2대의 Camera를 활용한다면 2개의 직선이 나올 것이고 각각의 직선에 대한 교점을 구한다면 Depth를 구할 수 있을 것이다.(같은 점에서 투영된 점이기 때문이다.)
Depth Esitimation을 수행하는 일반적인 과정은 다음과 같다.
Image Input
Find Corresponidg points
- 전통적인 기법으로는 ORB, SIFT 알고리즘과 같은 Local Feature Matching을 수행하여 대응되는 지점을 찾아낸다.(교점을 구하기 위해서는 각각의 Image Plane 상의 좌표들이 하나의 Pixel에서 출력되었다는 가정이 필요하다.)
- 최근에는 SuperPoint & SuperGlue와 같이 심층신경망을 통해 각 Pixel 별로 구별되는 특징값을 추출하는 기법을 이용한다.
Estimate Camera's Pose
Calculate depth
8 points algorithm, Triangulation, Stereo mathching을 통해서 2개의 지점에 대한 교점을 찾아주는 과정을 수행한다.
많은 Depth Esitimation 과정이 존재하겠지만, 여기서는 Stereo Camera를 활용한 내용을 담고자 한다.

Stereo Camera는 2개의 카메라가 하나의 몸체에 설치되어 있는 카메라로, epipolar geometry의 특별한 형태이다. 이러한 Stereo Camera의 특징을 2가지 정리해보자면 다음과 같다.
Rotation이 존재하지 않으므로 위에서 설명했던 Camera Pose Esitmation 과정이 필요하지 않다. 그렇다면 이러한 Stereo Camera에서는 어떻게 Depth를 추정할 수 있을지 기하학적으로 이를 살펴보고자 한다.
Stereo camera로 어떤 장면을 촬영하였을 경우, 멀리있는 물체는 위치가 조금만 변하지만, 가까이 있는 물체의 위치는 크게 변하게 된다. 이는 Disparity 따라서 결정이 되는데, 아래 Figure를 통해서 Disparity가 무엇인지 설명하고자 한다.

지금 위의 Figure에서 하나의 3차원 점 를 2개의 Camera를 통해서 촬영하였다고 생각하자. 참고로 Stereo Camera이므로 Rotation은 존재하지 않고 같은 방향을 촬영하였다고 생각하자.
추가적으로 , 사이의 Camera 간격도 알고 있다.
위의 Figure에서 보듯이 과 은 같은 지점 를 촬영하였지만, 위치차이가 발생한다. 이를 Disparity라고 한다. 쉽게 설명하자면 부터 사이의 거리를 , 부터 까지의 거리를 라고 한다면 Disparity는 이 될 것이다. 이러한 Disparity를 활용하여 Depth를 추정하게 된다.
이제 Stereo Camera를 활용하여 Depth를 추정하는 과정을 살펴보자.

먼저 위의 각각의 기호들이 무엇을 의미하는지부터 정리하자면 다음과 같다.
여기서 우리가 구하고자 하는 부분은 이다.
먼저 를 초록색 선을 따라서 평행이동하면 (큰 삼각형), (작은 삼각형)가 만들어질 것이다. 이 두 개의 삼각형은 닮음이므로 비례식을 사용한다면 다음과 같이 수식을 작성할 수 있을 것이다.
와 가 Figure 상에서는 생략되어있지만 평행이동시켜본다면 큰삼각형과 작은삼각형이라는 말을 통해서 어디 지점을 의미하는지 알 수 있을 것이다.
위의 수식에서 (baseline)과 (focal length)의 경우 Stereo Camera의 Hardware에서 결정되는 값이며, 이미 알고 있다고 가정한다. 따라서 Depth Estimation을 위해서는 (diparity)가 필요하다.

방금 설명하였듯이, 깊이를 계산하기 위해서는 Disparity가 필요하다 그러면 이러한 Disparity는 어떻게 구할 수 있는지를 설명하기 위해서 위의 Figure를 예시로 들어보겠다. 아까 전에도 설명하였듯이, Stereo Camera에서는 Rotation이 없다. 그렇다면 왼쪽 1번 Camera에서의 한 Pixel의 위치는 오른쪽 2번 Camera의 청록색 선 중에 하나의 지점일 것이다. 따라서 이를 탐색하기만 한다면 같은 지점에서 촬영한 Disparity를 구할 수 있을 것이다.
따라서 위의 Figure에서 보이는 것과 같이, 1번 카메라의 Image Patch를 떼어내서 청록색 Line의 모든 Pixel과 비교하여 유사도를 측정한다. 이때 유사도를 측정하는 방식은 다음과 같다.

위의 유사도를 측정해내는 Formula를 활용하여 Score가 가장 높은 지점이 matching되는 지점이라고 판단해낼 수 있을 것이다.
Stereo Matching에서 Image Patch에 따른 특징은 다음과 같다.
그렇다면 Matching이 어려운 경우는 없을까 크게 3가지 있다.
특히 금속 재질에 의한 specularities는 위치가 바뀜으로써 Pixel값이 크게 바뀌게 된다. Deep Learing을 활용하는 경우에도 여전히 어려움을 겪고 있다.
이번 포스트 내용까지 하여 Vision 내용을 마무리하고 다음 포스트부터는 Lidar와 이번 수업에서 가장 재밌게 봤던 Localization(Bayes Filter, Kalman Fiter, Extended Kalmanfilter)에 대해서 다루어 보고자한다.