스테레오 비전과 깊이 추정

다중 카메라를 활용한 깊이 추정은 스테레오 비전 기술을 기반으로 한다. 스테레오 비전은 두 개 이상의 카메라가 서로 다른 위치에서 동일한 장면을 촬영하고, 이 정보를 바탕으로 물체의 깊이(거리)를 계산하는 기법이다. 두 카메라의 시차(disparity)를 통해 깊이 정보를 얻을 수 있다.

스테레오 카메라에서 깊이 추정을 위해서는 두 가지 주요 단계가 필요하다:

  1. 카메라 캘리브레이션: 각 카메라의 내부 파라미터와 외부 파라미터를 알아야 한다.
  2. 이미지 정합: 두 카메라로부터 얻은 이미지에서 동일한 물체의 좌표를 매칭해야 한다.

카메라 모델

캘리브레이션 과정에서 사용되는 기본 카메라 모델은 핀홀(pinhole) 모델이다. 두 카메라의 투영 모델을 수학적으로 나타내면 다음과 같다. 각 카메라의 3D 좌표 \mathbf{P} = [X, Y, Z]^T는 2D 이미지 평면으로 투영되어 각각 \mathbf{p}_1 = [u_1, v_1]^T\mathbf{p}_2 = [u_2, v_2]^T로 변환된다.

\mathbf{p}_1 = \mathbf{K}_1 [\mathbf{R}_1 | \mathbf{t}_1] \mathbf{P}
\mathbf{p}_2 = \mathbf{K}_2 [\mathbf{R}_2 | \mathbf{t}_2] \mathbf{P}

여기서: - \mathbf{K}_1, \mathbf{K}_2는 각각의 카메라의 내부 파라미터 행렬이다. - \mathbf{R}_1, \mathbf{R}_2는 각각의 카메라 좌표계와 월드 좌표계 간의 회전 행렬이다. - \mathbf{t}_1, \mathbf{t}_2는 각각의 카메라 좌표계와 월드 좌표계 간의 변환 벡터(translation vector)이다.

스테레오 카메라의 기하학

스테레오 비전에서 중요한 요소는 두 카메라의 상대적인 위치이다. 이를 기초 기하학(epipolar geometry)라고 하며, 두 카메라 사이의 관계를 수학적으로 설명하는 방법이다. 두 카메라 간의 시차는 깊이 추정의 핵심 요소이다.

두 카메라에서 동일한 3D 점 \mathbf{P}에 대한 이미지는 서로 다른 위치에 투영되며, 그 차이를 시차(disparity)라고 한다. 시차는 깊이 Z와 반비례 관계에 있으며, 이를 통해 깊이를 추정할 수 있다.

시차 d는 다음과 같이 표현된다.

d = u_1 - u_2

깊이 Z는 시차와 초점 거리 f, 두 카메라 간의 베이스라인 B에 따라 다음 식으로 계산된다.

Z = \frac{f \cdot B}{d}

여기서: - f는 카메라의 초점 거리, - B는 두 카메라 간의 베이스라인(카메라 간 거리), - d는 시차이다.

이 식을 통해 시차가 클수록 깊이가 작고, 시차가 작을수록 깊이가 크다는 것을 알 수 있다.

에피폴라 기하학 (Epipolar Geometry)

스테레오 카메라에서 깊이를 추정할 때, 두 카메라 간의 기하학적 관계는 매우 중요한 역할을 한다. 이 관계를 설명하는 기본 개념이 에피폴라 기하학이다. 두 카메라에서 3D 공간의 한 점이 각 카메라의 이미지 평면에 투영될 때, 이 두 점이 위치하는 직선상의 관계를 에피폴라 기하학이 설명한다.

두 카메라가 동일한 3D 점 \mathbf{P}를 바라볼 때, 각 카메라에서 투영된 2D 이미지 좌표는 각각 \mathbf{p}_1\mathbf{p}_2이다. 이때 에피폴라 기하학은 각 투영점이 이미지 평면 상에서 속하는 선, 즉 에피폴라 선(epipolar line)과의 관계를 다룬다. 에피폴라 선은 두 카메라의 상대적 위치에 따라 달라지며, 에피폴라 기하학을 통해 깊이 추정 알고리즘을 효율적으로 구현할 수 있다.

본질 행렬 (Essential Matrix)

스테레오 카메라에서 두 이미지 간의 기하학적 관계를 수학적으로 나타내는 중요한 행렬이 본질 행렬(Essential Matrix)이다. 본질 행렬 \mathbf{E}는 두 카메라 사이의 회전 \mathbf{R}과 변환 \mathbf{t}을 포함하여 다음과 같이 정의된다:

\mathbf{E} = [\mathbf{t}]_{\times} \mathbf{R}

여기서: - \mathbf{R}은 두 카메라 간의 회전 행렬, - [\mathbf{t}]_{\times}는 변환 벡터 \mathbf{t}의 반대칭 행렬이다.

본질 행렬은 다음과 같은 관계를 만족한다:

\mathbf{p}_2^T \mathbf{E} \mathbf{p}_1 = 0

이 식은 한 이미지에서의 점 \mathbf{p}_1과 다른 이미지에서의 대응점 \mathbf{p}_2가 본질 행렬 \mathbf{E}에 의해 기하학적으로 제약을 받는다는 것을 의미한다.

기본 행렬 (Fundamental Matrix)

본질 행렬은 카메라 내부 파라미터에 의존하는 반면, 기본 행렬(Fundamental Matrix) \mathbf{F}은 카메라의 내부 파라미터와 상관없이 두 이미지 간의 기하학적 관계를 설명한다. 기본 행렬은 본질 행렬 \mathbf{E}와 내부 파라미터 행렬 \mathbf{K}_1, \mathbf{K}_2을 이용해 다음과 같이 정의된다:

\mathbf{F} = \mathbf{K}_2^{-T} \mathbf{E} \mathbf{K}_1^{-1}

기본 행렬 또한 다음과 같은 관계를 만족한다:

\mathbf{p}_2^T \mathbf{F} \mathbf{p}_1 = 0

이 식을 통해 두 이미지 간의 대응점을 찾는 과정을 간소화할 수 있으며, 기본 행렬을 통해 에피폴라 선을 효율적으로 계산할 수 있다.

깊이 추정 알고리즘

스테레오 카메라를 통한 깊이 추정은 크게 세 가지 단계로 이루어진다:

  1. 이미지 정합: 두 카메라로부터 얻은 이미지에서 동일한 물체의 좌표를 매칭한다. 일반적으로 에피폴라 제약을 사용하여 매칭 범위를 줄일 수 있다.

  2. 시차 계산: 매칭된 두 점 사이의 시차를 계산한다. 시차는 수평 방향으로 이동한 거리를 나타내며, 이를 통해 깊이를 추정할 수 있다.

  3. 깊이 계산: 시차 값을 이용하여 앞서 제시한 식 Z = \frac{f \cdot B}{d}를 사용해 각 점에 대한 깊이를 계산한다.

이 과정을 통해 스테레오 비전 시스템에서 3D 환경의 깊이 지도를 생성할 수 있다. 이러한 깊이 지도는 자율 주행, 로봇 비전, 증강 현실 등 다양한 분야에서 중요한 역할을 한다.