1. 핀홀 카메라 모델 개요

핀홀 카메라 모델은 3차원 공간의 객체를 2차원 이미지 평면에 투영하는 가장 간단한 모델이다. 실제 렌즈 기반 카메라와 달리, 핀홀 카메라는 이상적인 상황을 가정하여 빛이 작은 구멍을 통해 들어오고 그 빛이 이미지 평면에 정확하게 투영된다고 가정한다.

핀이 있는 구멍을 통과하는 빛은 일직선으로 이동하며, 이러한 빛의 경로는 3D 공간에서의 객체와 2D 이미지 평면 간의 변환 관계를 정의한다. 이 모델은 기하학적 투영의 핵심을 단순화하여 설명할 수 있는 강력한 도구이다.

2. 좌표계 정의

핀이 있는 구멍을 중심으로 좌표계를 정의할 수 있다. 일반적으로 다음과 같은 두 좌표계를 정의한다.

이 두 좌표계는 일반적으로 회전 및 평행 이동 변환에 의해 서로 변환된다. 이러한 변환은 회전 행렬 \mathbf{R}과 평행 이동 벡터 \mathbf{t}로 표현된다.

\mathbf{X}_c = \mathbf{R} \mathbf{X}_w + \mathbf{t}

여기서, \mathbf{R}3 \times 3 회전 행렬, \mathbf{t}3 \times 1 평행 이동 벡터이다.

3. 프로젝션 모델

핀이 있는 구멍을 통해 빛이 투과되어 이미지 평면에 투영되는 과정을 설명하기 위해 투영 행렬을 사용한다. 3차원 점 \mathbf{X}_c = (X_c, Y_c, Z_c)^T가 이미지 평면에 투영되는 과정은 다음과 같이 설명할 수 있다.

핀홀 카메라 모델에서 3D 좌표 \mathbf{X}_c는 2D 이미지 좌표 \mathbf{x} = (x, y)^T로 투영된다. 이때, 투영 변환은 다음과 같다:

x = f \frac{X_c}{Z_c}, \quad y = f \frac{Y_c}{Z_c}

여기서 f는 카메라의 초점 거리(focal length)를 의미하며, Z_c는 점이 카메라에서 얼마나 떨어져 있는지 나타낸다. 위의 식은 기본적인 투영 관계를 설명하며, 이를 행렬로 나타내면 다음과 같이 된다.

4. 카메라 투영 행렬

투영 과정을 더 일반화하면, 3D 공간의 점을 2D 이미지 평면으로 변환하는 과정은 카메라 매트릭스로 설명할 수 있다. 카메라 매트릭스 \mathbf{P}는 다음과 같이 정의된다:

\mathbf{x}_{\text{homog}} = \mathbf{P} \mathbf{X}_{\text{homog}}

여기서 \mathbf{x}_{\text{homog}} = (x, y, 1)^T는 2D 동차 좌표(homogeneous coordinates)로 표현된 이미지 평면 좌표이고, \mathbf{X}_{\text{homog}} = (X_c, Y_c, Z_c, 1)^T는 3D 동차 좌표이다. 카메라 매트릭스 \mathbf{P}는 내부 및 외부 파라미터를 모두 포함한 3 \times 4 행렬로 정의된다.

카메라 매트릭스는 내부 매개변수 \mathbf{K}와 외부 매개변수 [\mathbf{R}|\mathbf{t}]의 곱으로 표현된다:

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

여기서 \mathbf{K}내부 파라미터 행렬로, 카메라 자체의 특성을 설명한다. 내부 파라미터 행렬 \mathbf{K}는 다음과 같은 형태를 갖는다:

\mathbf{K} = \begin{pmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{pmatrix}

5. 동차 좌표와 투영 변환

카메라 모델에서 중요한 개념 중 하나는 동차 좌표이다. 동차 좌표계를 사용하면, 카메라 모델에서의 투영 변환을 더욱 명확하게 표현할 수 있다. 동차 좌표로 표현된 3차원 점 \mathbf{X}_{\text{homog}}를 카메라 매트릭스 \mathbf{P}에 적용하여 2차원 점 \mathbf{x}_{\text{homog}}로 투영하는 과정을 수식으로 나타내면 다음과 같다:

\mathbf{x}_{\text{homog}} = \mathbf{K} [\mathbf{R}|\mathbf{t}] \mathbf{X}_{\text{homog}}

이때, 결과로 나온 \mathbf{x}_{\text{homog}}는 동차 좌표이므로, 최종적인 2D 이미지 좌표를 얻기 위해서는 이를 비동차(non-homogeneous) 좌표로 변환해야 한다. 이를 위해 \mathbf{x}_{\text{homog}} = (x', y', w')^T에서 w'로 나누어 비동차 좌표 \mathbf{x} = (x, y)^T를 구할 수 있다:

x = \frac{x'}{w'}, \quad y = \frac{y'}{w'}

6. 핀홀 카메라 모델의 단점

핀홀 카메라 모델은 매우 이상적이고 단순한 모델이지만, 실제 카메라에서 발생하는 왜곡이나 기타 물리적 특성을 반영하지 못하는 단점이 있다. 특히, 다음과 같은 문제들이 존재한다:

  1. 렌즈 왜곡: 실제 카메라 렌즈는 빛을 완벽히 직선으로 투과시키지 않는다. 이로 인해 이미지에서 왜곡(distortion)이 발생하며, 이는 핀홀 모델에서 고려되지 않는 요소이다.
  2. 비선형성: 핀홀 모델은 투영 변환을 선형적으로 처리하지만, 실제 카메라 시스템은 비선형적인 특성을 가질 수 있다. 이러한 비선형 특성은 이미지의 정확도에 영향을 미칠 수 있다.
  3. 초점 거리와 이미지 센서의 비대칭성: 실제 카메라는 종종 f_xf_y의 값이 달라지며, 이미지 센서가 완전히 대칭적이지 않거나 중심에서 약간 벗어날 수 있다.

이러한 문제들은 핀홀 카메라 모델이 현실적인 상황에서 완벽하게 적용되지 않음을 보여준다. 따라서 실제 카메라에서 발생하는 다양한 물리적 현상들을 보정하기 위해 왜곡 보정이나 캘리브레이션과 같은 추가적인 과정이 필요하다.

7. 예제: 3D 점의 투영

실제 3D 점이 어떻게 이미지 평면으로 투영되는지 살펴보겠다. \mathbf{X}_c = (X_c, Y_c, Z_c)^T라는 3D 카메라 좌표계의 점이 있다고 가정할 때, 이를 핀홀 카메라 모델을 통해 2D 이미지 평면으로 투영하는 과정은 다음과 같다:

x = f \frac{X_c}{Z_c}, \quad y = f \frac{Y_c}{Z_c}

여기서, f는 카메라의 초점 거리이다. 이를 행렬 형태로 일반화하면, 다음과 같은 투영 변환식을 얻을 수 있다:

\mathbf{x}_{\text{homog}} = \mathbf{K} [\mathbf{R}|\mathbf{t}] \mathbf{X}_{\text{homog}}

위 수식을 통해, 3차원 좌표계의 점이 카메라 좌표계에서 어떻게 이미지 평면에 매핑되는지 확인할 수 있다.

예제 1: 간단한 투영

초점 거리 f = 1000이고, 카메라 중심은 이미지의 중심과 일치한다고 가정한다. 이제 3D 공간의 점 \mathbf{X}_c = (1, 2, 10)^T을 투영한다고 가정하면, 이미지 평면에서의 2D 좌표는 다음과 같이 계산된다:

x = 1000 \cdot \frac{1}{10} = 100, \quad y = 1000 \cdot \frac{2}{10} = 200

따라서 이 3D 점은 이미지 평면에서 (100, 200) 위치에 매핑된다.

8. 구현 예시

핀홀 카메라 모델을 활용한 투영을 프로그래밍으로 구현할 수 있다. 예를 들어, Python을 이용하여 OpenCV 라이브러리를 사용해 3D 점을 2D 이미지 평면에 투영하는 코드는 다음과 같다.

import numpy as np

focal_length = 1000
cx, cy = 320, 240 # 이미지 중심

K = np.array([
    [focal_length, 0, cx],
    [0, focal_length, cy],
    [0, 0, 1]
])

X_c = np.array([1, 2, 10])

X_homog = np.hstack([X_c, 1])
x_homog = K @ X_homog[:3]  # 투영 후 homogenous 좌표

x = x_homog[:2] / x_homog[2]

print("Projected 2D point:", x)

위 코드는 기본적인 핀홀 카메라 모델에 기반한 3D 점의 투영을 시뮬레이션한다.