Subjects/Computer Vision

[Camera model] Pinhole camera

BiniU 2022. 3. 25. 11:56

우리가 computer vision을 이해하기 위해서는 카메라의 동작에 대한 이해가 필수적이다.

카메라는 3D 공간의 물체를 투영하여 2D 카메라 센서에 상을 맺히게 한다.

 

우리는 그 과정을 이해하기 위해서 가장 기초적이고 ideal 한 경우인 pinhole 카메라 모델에 대해서 알아본다. 

Pinhole 카메라 모델이 가장 ideal 하다고 이야기 하는 것은 카메라 렌즈에 의한 왜곡이 고려되지 않기 때문이다. 

렌즈로 인한 왜곡은 다음 포스트에서 살펴 보도록 한다.

그림 1


 

 

그림 2

그림에서 먼저 봐야 할 것은 카메라의 위치와 그 좌표축이다. 

그림에는 카메라의 중심과, 중심을 기준으로 한 x, y, z축의 양의 방향이 표현되어 있다.

 

카메라 중심에서 정면 방향이 z축, 우측 방향이 x축, 하단 방향이 y축이다. 

대부분의 일반적인 카메라는 위와 같은 좌표계를 따른다.

 

 

그림 3

실제 Pinhole 카메라는 [그림 3]의 왼쪽과 같은 모델을 갖는다. 

상이 맺히는 이미지 센서가 렌즈의 뒤쪽에 있어서 뒤집힌 모양을 갖게 된다. 

그렇게 되면 실제 물제의 좌표와 이미지 상의 좌표를 표현했을 때, 음수 값이 들어가게 된다. 

 

그래서 좀 더 이해하기 편하기 위해 우리는 렌즈 앞 동일한 거리에 가상의 이미지 평면을 만들어서 생각한다.

 

그림 4

Pinhole 카메라 모델을 좀 더 디테일 하게 표현해보면 위와 같다. 

카메라의 중심은 $F_c$로 나타나 있고, 3D 물체는 $P = (X, Y, Z)$ 로 표현 되어 있다. 

 

여기서 optical axis로 표현된 선은 '광학축' 이라고 하여, 카메라의 z축 방향을 의미한다. 

Principal point는 optical axis와가상의 이미지 센서가 만나는 좌표를 의미한다. 

 

 

[그림 4]에는 총 3개의 좌표계를 주목해야 한다. 

  • 3D Camera coordinate
  • Image coordinate
  • Pixel coordinate

 

첫 번째, 3D Camera coordinate는 카메라를 기준으로 생성된 3차원 좌표계를 의미한다. 

[그림 4]에서는 검정색 $X_c, Y_c, Z_c$로 표현되어 있다. 

이 좌표계를 통해 3차원 물체 P는 $(X, Y, Z)$라는 값으로 표현된다.

당연히 원점은 카메라 중심인 $F_c$이다.

 

두 번째, Image coordinate는 이미지 평면에서 광학축을 기준으로 생성되는 2차원 좌표계를 의미한다.

[그림 4]에서는 하늘 색 점선 $x, y$로 표현되어 있다.

이 좌표계는 원점이 principal point이고, camera coordinate system의 $X_c, Y_c$ 방향과 동일한 방향을 나타낸다.

 

세 번째, Pixel coordinate는 최종적으로 이미지 상에 맺힌 2D 점을 픽셀 단위로 나타내기 위한 2차원 좌표계이다.

[그림 4]에서는 카키(?) 색 점선 $u, v$로 나타나 있다. 

이 좌표계는 이미지에서 픽셀을 표현할 때와 마찬가지로 원점이 이미지 평면 좌측 상단에 위치한다.

또한 각 축이 나타내는 방향은 Image coordinate system의 $x, y$방향과 동일하다.

 


 

이제는 3D 물체가 2D pixel 좌표로 표현되는 방법을 두 단계로 나눠서 설명할 것이다. 

  • 3D camera coordinate → 2D image coordinate
  • 2D image coordinate → 2D pixel coordinate

 

 

<3D camera coordinate → 2D image coordinate>

 

3D camera coordinate와 2D image coordinate의 $x, y$ 방향은 동일하다. 

따라서 [그림 4]를 위에서 내려다 보면 [그림 5]와 같다.

 

그림 5

뭔가 아예 다른 그림인 것 같지만 사실 그렇지 않다. (반으로 잘린 것이라고 생각하면 된다)

[그림 4]의 $P$는 [그림 5]의 $P$와 동일하다. 

 

그리고 [그림 4]에 있었던 이미지 평면을 위에서 바라본 것이 $Z_c = f$에 있는 점선이다. 

(이 때 f는 focal length 의 약자로 pixel 단위를 갖는다.)

더보기

엥? 왜 카메라의 중심과 이미지 평면 사이의 길이를 pixel로 표현하는지?

 

'카메라 모델' 에서 말하는 초점거리는 pixel 단위이다. 

이미지의 pixel은 이미지 센서의 하나의 cell 크기에 대응되는 값이다. 

 

예를 들어, 이미지 센서의 셀(cell)의 크기가 0.1 mm이고 카메라의 초점거리가 f = 500 pixel이라고 하면,

이 카메라의 렌즈 중심에서 이미지 센서까지의 거리는 이미지 센서 셀(cell) 크기의 500배

즉, 50 mm라는 의미이다.

 

/* 출처: 다크프로그래머 블로그 */

 

아까 [그림 4]에서 이미지 평면과 카메라 중심과의 거리가 $f$였다고 생각하면 된다.

 

[그림 5]를 보면 삼각형의 닮음비를 사용했음을 알 수 있다. 

그림의 세 삼각형은 모두 닮음이고, 닮음비는 z축의 값을 통해 정의한다. 

 

가장 큰 삼각형과 가장 작은 삼각형의 닮음비는 $Z\ :\ 1$ 이기 때문에 

$P' = (X/Z,\ Y/Z,\ 1)$이 된다. 

 

마찬가지로 가장 작은 삼각형과 두 번째 삼각형의 닮음비는 $1\ :\ f$ 이기 때문에 

$P'' = (f{X \over Z},\ f{Y \over Z},\ f)$로 나타낼 수 있다. 

 

그런데 실제로 카메라 모델에서는 물리적인 cell의 가로, 세로 길이가 정확하게 동일하지 않은 경우가 있어서

$f_x$ = focal length가 cell 가로 크기의 몇 배인지

$f_y$ = focal length가 cell 세로 크기의 몇 배인지

이 두 값을 사용한다.

$\therefore P'' = (f_x{X \over Z},\ f_y{Y \over Z},\ f)$

 

그리고 이 $P''$점은 현재 3D camera coordinate에서 표현되어있다. 

하지만 3D camera coordinate와 2D image coordinate의 $x,\ y$ 방향은 동일하기 때문에

$P''$, 즉 3차원 점이 투영된 2D 점의 image coordinate 좌표는 $(f_x{X \over Z},\ f_y{Y \over Z})$ 이다.

 

 

 

<2D image coordinate → 2D pixel coordinate>

 

2D image coordinate에서 2D pixel coordinate로 변환하는 과정은 간단하다. 

동일한 평면에서 2D image 좌표계의 중심점을 $x,\ y$방향으로 각각 이동해주면 된다. 

 

먼저 2D image 좌표계의 중심은 2D pixel 좌표계로 $c_x,\ c_y$의 값을 갖는다. 

그리고 그 때의 3차원 점이 투영된 2D 점의 위치는 위에서 구한 대로 $(x,\ y) = (f_x{X \over Z},\ f_y{Y \over Z})$ 이다.

 

2D image 좌표계에서 2D pixel 좌표계로 바꿔주기 위해서 

2D image 좌표계의 원점을 $-c_x,\ -c_y$ 만큼 이동한다. 

 

그러면 좌표계 자체가 움직이는 것이고 투영된 2D 점의 위치는 움직이지 않는다. 

따라서 2D 점의 좌표는 $c_x,\ c_y$ 만큼 커지게 되고 아래의 값을 갖는다.

 

$(u, v) = (f_x{X \over Z} + c_x,\ f_y{Y \over Z} + c_y)$

 


정리를 해보면, 3차원 점 $P$가 2차원 이미지 평면에 투영된 점 $p$ 으로 변환되는 과정은 다음과 같다.

$$P = (X,\ Y,\ Z)$$

$$p = (f_x{X \over Z} + c_x,\ f_y{Y \over Z} + c_y)$$

 

이 과정은 Homogeneous 좌표계에서 아래와 같이 matrix를 통해 linear 하게 표현할 수 있다.

$(u,\ v)$는 2D 점의 좌표인데 Homogeneous 좌표계이기 때문에 앞에 scale 값을 표기하였다. 

$$s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix}f_x& 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix}$$

 

이 때 K 행렬을 Camera intrinsic parameter라고 부르고, P 행렬을 Perspective projection matrix라고 부른다.

$$K = \begin{bmatrix}f_x& 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}$$

$$P = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix}$$

 

반응형

'Subjects > Computer Vision' 카테고리의 다른 글

Euler angles  (0) 2022.06.24
[Camera model] Camera calibration  (0) 2022.03.31
[Camera model] Lens distortion  (1) 2022.03.25
[Notations]  (0) 2022.03.23
[Geometric primitives] 2D points, 2D lines, 2D conics  (0) 2022.03.23