삼각 측량의 개념

삼각 측량(triangulation)은 스테레오 비전 시스템에서 두 카메라의 이미지를 기반으로 3D 공간 내 물체의 좌표를 추정하는 기법이다. 두 개의 서로 다른 시점에서 촬영된 이미지 상의 대응점을 활용하여 물체의 깊이 정보를 계산할 수 있다. 이 기법은 에피폴라 기하학의 기본 원리에 기반하고 있으며, 두 카메라의 위치와 방향을 알고 있을 때, 각 카메라로부터 관찰된 물체의 이미지 좌표를 이용하여 해당 물체의 3차원 좌표를 추정한다.

카메라 좌표계와 3D 좌표계의 관계

삼각 측량에서 3D 좌표를 추정하기 위해서는 각 카메라의 내부 파라미터(초점 거리, 주점 등)와 외부 파라미터(회전 및 이동 벡터)를 알아야 한다. 카메라 좌표계와 3D 월드 좌표계는 아래와 같은 변환 관계로 정의된다.

카메라의 외부 파라미터를 나타내는 회전 행렬 \mathbf{R}과 이동 벡터 \mathbf{t}가 주어졌을 때, 3D 월드 좌표계의 점 \mathbf{X_w}는 카메라 좌표계의 점 \mathbf{X_c}로 변환된다:

\mathbf{X_c} = \mathbf{R} \mathbf{X_w} + \mathbf{t}

여기서: - \mathbf{X_c}는 카메라 좌표계에서의 점의 좌표, - \mathbf{R}는 카메라의 회전 행렬, - \mathbf{t}는 카메라의 이동 벡터.

카메라에서 얻어진 2D 이미지 좌표 \mathbf{x}는 카메라 내부 파라미터 행렬 \mathbf{K}에 의해 카메라 좌표계에서 이미지 평면으로 투영된다:

\mathbf{x} = \mathbf{K} [\mathbf{R} | \mathbf{t}] \mathbf{X_w}

여기서: - \mathbf{K}는 카메라 내부 파라미터 행렬, - [\mathbf{R} | \mathbf{t}]는 카메라의 외부 파라미터 행렬.

이미지 좌표와 대응점

스테레오 카메라 시스템에서 두 카메라가 일정한 거리만큼 떨어져 있을 때, 동일한 3D 물체의 점이 두 이미지 상에서 서로 다른 위치에 나타난다. 이때, 두 이미지의 대응점(corresponding points)을 찾아내는 과정이 스테레오 매칭(stereo matching)이다. 대응점의 좌표는 각 이미지에서 측정된 픽셀 좌표 \mathbf{x_1}\mathbf{x_2}로 나타낼 수 있다.

각 카메라의 투영 행렬이 \mathbf{P_1} = \mathbf{K_1}[\mathbf{R_1} | \mathbf{t_1}]\mathbf{P_2} = \mathbf{K_2}[\mathbf{R_2} | \mathbf{t_2}]일 때, 두 카메라의 이미지 평면 상에서 대응점을 찾으면 이를 이용해 삼각 측량을 통해 3D 좌표를 구할 수 있다.

삼각 측량 수식

두 이미지에서 대응되는 점을 찾았다면, 해당 점의 깊이 정보는 두 카메라로부터의 시차(parallax)를 이용하여 계산할 수 있다. 이때, 각 카메라에서의 광선이 만나는 지점이 3D 공간에서의 물체의 위치를 나타낸다.

3차원 좌표 \mathbf{X}는 두 이미지 좌표 \mathbf{x_1}\mathbf{x_2}를 바탕으로 삼각 측량을 통해 다음과 같이 계산할 수 있다:

\mathbf{X} = \left( \mathbf{A}^\top \mathbf{A} \right)^{-1} \mathbf{A}^\top \mathbf{b}

여기서: - \mathbf{A}는 두 카메라의 투영 행렬에 따른 관계식을 나타내는 행렬, - \mathbf{b}는 이미지 좌표로부터 얻어진 값들의 벡터.

이 수식은 최소 자승법을 통해 해결되며, 주어진 대응점에 대한 최적의 3D 좌표를 추정할 수 있다.

시차(parallax)와 깊이 계산

스테레오 카메라 시스템에서 물체의 깊이를 계산하는 중요한 개념은 시차(parallax)이다. 두 카메라에서 관찰한 물체의 이미지 좌표 차이를 시차라고 하며, 이를 통해 물체와 카메라 사이의 거리를 계산할 수 있다.

두 카메라 간의 기준점 사이의 거리를 기준 거리(baseline) \mathbf{B}라고 하고, 두 카메라에서 얻은 물체의 이미지 좌표를 각각 x_1, x_2라고 할 때, 시차 d는 다음과 같이 정의된다:

d = x_1 - x_2

여기서 시차 d는 스테레오 이미지 상에서의 두 점의 수평 차이를 나타내며, 이를 통해 물체의 깊이 Z를 계산할 수 있다. 깊이 Z는 아래와 같이 시차에 반비례하여 결정된다:

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

여기서: - Z는 물체의 깊이(카메라와의 거리), - f는 카메라의 초점 거리, - B는 두 카메라 사이의 기준 거리, - d는 시차.

이 식은 평행 카메라 시스템(parallel camera system)에서 간단하게 사용할 수 있으며, 이 경우 각 카메라의 광축(optical axis)이 동일한 방향을 가리킨다.

비평행 카메라 시스템에서의 삼각 측량

실제 스테레오 비전 시스템에서는 두 카메라가 반드시 평행하게 배치되지 않을 수도 있다. 비평행 카메라 시스템에서 삼각 측량을 수행하려면 더 복잡한 기하학적 계산이 필요하다. 이 경우 두 카메라의 투영 행렬을 이용하여 삼각 측량을 수행하게 된다.

카메라 1과 카메라 2의 투영 행렬을 각각 \mathbf{P_1}\mathbf{P_2}라고 하면, 3차원 좌표 \mathbf{X}는 아래의 관계식에 따라 두 카메라에서의 이미지 좌표 \mathbf{x_1}\mathbf{x_2}로부터 추정된다:

\mathbf{x_1} = \mathbf{P_1} \mathbf{X}, \quad \mathbf{x_2} = \mathbf{P_2} \mathbf{X}

이 두 식을 결합하여 삼각 측량 문제를 다음과 같이 행렬 형태로 나타낼 수 있다:

\mathbf{A} \mathbf{X} = 0

여기서 \mathbf{A}는 두 카메라의 투영 행렬과 이미지 좌표에 따른 행렬로 구성된다. 이 식을 최소 자승법(least squares method)을 통해 해결하여 물체의 3D 좌표 \mathbf{X}를 추정할 수 있다.

일반화된 삼각 측량

비평행 카메라 시스템에서의 삼각 측량을 보다 일반화하여 설명할 수 있다. 대응점의 좌표 \mathbf{x_1}\mathbf{x_2}는 다음과 같은 에피폴라 제약식(epipolar constraint)을 만족한다:

\mathbf{x_2}^\top \mathbf{F} \mathbf{x_1} = 0

여기서 \mathbf{F}기본 행렬(fundamental matrix)로, 두 카메라 간의 기하학적 관계를 나타낸다. 이 행렬을 통해 이미지 좌표들 간의 기하학적 일관성을 보장할 수 있으며, 이를 이용해 3D 좌표를 추정할 수 있다.

기본 행렬을 이용한 삼각 측량

비평행 카메라 시스템에서 삼각 측량을 수행할 때, 기본 행렬 \mathbf{F}은 두 카메라 사이의 기하학적 관계를 반영하는 중요한 요소이다. 이 행렬은 대응점들이 에피폴라 제약을 만족하도록 하며, 이미지 평면에서의 대응점들이 서로 일관되게 맞추어지도록 한다.

두 카메라에서의 이미지 좌표 \mathbf{x_1}\mathbf{x_2}는 다음과 같은 에피폴라 제약식을 만족해야 한다:

\mathbf{x_2}^\top \mathbf{F} \mathbf{x_1} = 0

이 식은 기본 행렬 \mathbf{F}와 두 이미지 좌표 사이의 관계를 나타내며, 이를 기반으로 대응점을 찾고 삼각 측량을 통해 3D 좌표를 추정할 수 있다. 기본 행렬 \mathbf{F}는 두 카메라의 내부 및 외부 파라미터로부터 유도될 수 있으며, 스테레오 비전 시스템의 중요한 파라미터이다.

본질 행렬을 이용한 삼각 측량

기본 행렬이 두 이미지 좌표의 관계를 표현하는 것과 유사하게, 본질 행렬 \mathbf{E}은 두 카메라의 상대적인 회전과 이동 정보를 반영하여 3D 좌표 추정을 돕는다. 본질 행렬은 다음과 같은 형태로 정의된다:

\mathbf{E} = \mathbf{K_2}^\top \mathbf{F} \mathbf{K_1}

여기서: - \mathbf{K_1}\mathbf{K_2}는 각각 첫 번째 카메라와 두 번째 카메라의 내부 파라미터 행렬, - \mathbf{F}는 기본 행렬.

본질 행렬은 두 카메라 사이의 상대적인 회전 \mathbf{R}과 이동 \mathbf{t}로부터 다음과 같이 유도된다:

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

여기서 [\mathbf{t}]_\times는 이동 벡터 \mathbf{t}의 반대칭 행렬이다.

3D 좌표 추정의 과정

두 카메라에서 이미지 상의 대응점을 찾았다면, 이를 기반으로 삼각 측량을 통해 3D 좌표를 추정할 수 있다. 기본적으로 삼각 측량을 통해 추정된 3D 좌표 \mathbf{X}는 카메라 좌표계를 기준으로 한다. 카메라 1과 카메라 2의 투영 행렬 \mathbf{P_1}\mathbf{P_2}를 이용해 3D 좌표를 계산하는 과정은 다음과 같다.

먼저, 카메라 1에서의 이미지 좌표 \mathbf{x_1}과 카메라 2에서의 이미지 좌표 \mathbf{x_2}는 각각 아래의 관계식을 만족한다:

\mathbf{x_1} = \mathbf{P_1} \mathbf{X}, \quad \mathbf{x_2} = \mathbf{P_2} \mathbf{X}

이 두 식을 결합하면 삼각 측량 문제를 아래와 같은 선형 방정식으로 변환할 수 있다:

\mathbf{A} \mathbf{X} = 0

이때 \mathbf{A}는 두 카메라의 투영 행렬과 이미지 좌표를 결합한 행렬로, 이 선형 방정식을 최소 자승법을 통해 해결하면 \mathbf{X}를 추정할 수 있다.

최종적으로, 삼각 측량을 통해 구한 3D 좌표는 카메라 좌표계에 종속적이므로, 월드 좌표계에서의 절대적인 위치를 얻기 위해서는 두 카메라의 외부 파라미터(회전 및 이동)를 이용한 변환이 필요하다.

에러와 오차 분석

삼각 측량 기법을 통해 3D 좌표를 추정할 때, 다양한 요인으로 인해 오차가 발생할 수 있다. 주요 오차 요인으로는 카메라 보정의 불완전성, 이미지 잡음, 그리고 정확한 대응점 추출의 어려움 등이 있다. 이러한 오차는 최종적으로 계산된 3D 좌표의 정확성에 영향을 미치며, 이를 줄이기 위한 다양한 기법들이 연구되고 있다.

오차를 분석하기 위해 각 이미지에서의 대응점의 위치와 실제 3D 좌표 간의 차이를 측정할 수 있다. 이를 재투영 오차(reprojection error)라고 하며, 다음과 같이 정의된다:

\text{재투영 오차} = \frac{1}{N} \sum_{i=1}^{N} \|\mathbf{x_i} - \hat{\mathbf{x_i}}\|^2

여기서: - \mathbf{x_i}는 실제 이미지 상의 대응점, - \hat{\mathbf{x_i}}는 추정된 3D 좌표를 다시 이미지 평면으로 투영한 좌표.

재투영 오차는 추정된 3D 좌표가 얼마나 정확한지를 나타내는 중요한 지표이다.