본문 바로가기

Computer Vision/3D

[Vision Geometry] 카메라 모델 (Camera model)

이미지는 기본적으로 외부의 빛을 렌즈를 통해 모으고 이미지 센서에 모여든 빛을 디지털화하여 생성합니다.

다르게 말하면 어느 3차원 좌표에서 반사된 빛을 2D 이미지 평면에 사영시키는 것이라 볼 수 있습니다.

 

이번 포스팅에는 multi view geometry에 가장 기본이 되는 카메라 모델에 대해 정리해 보려 합니다.

 

카메라 모델이란 real world와 image사이의 관계를 수식으로 근사해 놓은 것입니다.

처음에 언급했듯이 image는 3D real world에서의 좌표를 2D camera 좌표로 변환하는 것인데요.

이러한 변환 관계를 몇 가지 물리적 파라미터를 통해 정의할 수 있습니다.

 

우선 크게 내부 파라미터와 외부 파라미터로 나눌 수 있는데요.

 

내부 파라미터 (Intrinsic parameter)

  • principal point
  • focal length
  • skew coefficient

외부 파라미터 (Extrinsic parameter)

  • camera position
  • camera orientation

 

내부 파라미터는 카메라가 생성될 때 이미 정해져 있습니다. 카메라의 픽셀 크기, 초점 거리, 왜곡 정도 등등이 제작될 때 이미 정해지기 때문입니다.

외부 파라미터의 경우 카메라의 위치와 카메라가 어떻게 어디를 바라보고 있는지를 나타냅니다.

각 파라미터에 대한 설명은 밑에 수식으로 변환관계를 설명하면서 좀 더 자세히 알아보겠습니다.

 

카메라 모델은 보통 핀홀 카메라 모델 (pinhole camera model)을 기반으로 모델링 됩니다.

핀홀 카메라의 경우 모델이 매우 간단하고 렌즈 없이 작은 개구하나 뿐이기 때문에 렌즈 왜곡을 고려하지 않아도 될뿐더러 조리개 값을 0으로 가정할 수 있기 때문에 비교적 간단하게 모델링이 가능합니다.

 

< 그림 1 > Pinhole camera model

 

하지만 핀홀 카메라의 단점이라 한다면 상이 반대로 맺혀 inverted image가 된다는 점 입니다. 카메라 안으로 한 빛이 투과되면 pinhole을 통과하면서 선이 굴곡되지 않고 일직선으로 view plane에 맺히기 때문입니다. 

카메라 모델에서는 연산을 단순화하기 위해 상이 올바르게 보이게끔 3D object와 pinhole사이에 가상의 image plane을 생성합니다.

 

< 그림 2 > virtual image plane (출처: MathWorks)

 

지금까지 카메라 모델에 대한 간단한 소개였구요.

이제 최종 목적인 real world의 3차원 좌표를 image 2차원 좌표로 사영(projection)시키는 방법에 대해 알아보겠습니다.

 

< 식 1 >

$$
w\left[\begin{array}{l}
u \\
v \\
1
\end{array}\right]=\boldsymbol{K}[\boldsymbol{R}, t]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]=\left[\begin{array}{ccc}
f_x & s & c_x \\
0 & f_y & c_y \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{llll}
r_{11} & r_{12} & r_{13} & t_x \\
r_{21} & r_{22} & r_{23} & t_y \\
r_{31} & r_{32} & r_{33} & t_z
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]
$$

 

image coordinate : $u, v$

world coordinate : $x, y, z$

Intrinsic parameter : $K$

Extrinsic parameter : $R, t$

 

위의 수식은 real world의 $(x,y,z)$좌표를 image 좌표 $(u, v)$로 투영시키는 행렬식입니다.

갑자기 여러 파라미터들이 튀어나왔는데...

우선은 real world의 3차원 좌표가 $[R,t]$ 3D rotation과 translation을 거쳐 perspective projection이 된 후 카메라 내부 파라미터 K를 곱해 최종 image 좌표가 구해진다는 이 흐름만 기억하고 넘어갑시다.

 

<식 1>은 카메라를 찍는 사람과 카메라에 대해 어떠한 정보도 없었을 때의 식입니다.

상황을 하나씩 가정하면서 위의 파라미터들의 존재이유를 알아보겠습니다.

 

 

가정 1

  • 카메라가 어떠한 회전도 없이 정면을 바라보고 있다.

 

위의 조건이 생기면 <식1>에서의 $R$의 회전행렬 부분을 단위행렬로 바꿀 수 있습니다.

$r_{11} ~ r_{33}$은 각각 x축, y축, z축의 회전행렬을 곱해서 나온 계수를 의미하기 때문입니다.

 

<식 2>

$$
w\left[\begin{array}{l}
u \\
v \\
1
\end{array}\right]=\boldsymbol{K}[\boldsymbol{R}, t]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]=\left[\begin{array}{ccc}
f_x & s & c_x \\
0 & f_y & c_y \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{cccc}
1 & 0 & 0 & t_x \\
0 & 1 & 0 & t_y \\
0 & 0 & 1 & t_z
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]
$$

$$
=\left[\begin{array}{ccc}
f_x & s & c_x \\
0 & f_y & c_y \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{l}
x+t_x \\
y+t_y \\
z+t_z
\end{array}\right]
$$

 

하지만 아직 카메라가 항상 원점에만 존재한다고 보장할 수 없으니
이동되어 있는 카메라의 위치만 translation을 통해 원점으로 맞춰주면 되어 식이 조금 더 간단해진 것을 확인할 수 있습니다. 

 

 

가정2

  • 카메라가 어떠한 회전도 없이 정면을 바라보고 있다.
  • 카메라가 원점 (0, 0, 0)에 존재한다.

 

위의 조건이 생기면 이제 카메라의 외부파라미터는 신경 쓰지 않아도 됩니다.

translation 또한 없기 때문에 카메라의 위치를 조정하는 t 값은 0이 됩니다.

 

<식 3>

$$
w\left[\begin{array}{l}
u \\
v \\
1
\end{array}\right]=\boldsymbol{K}[\boldsymbol{R}, t]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]=\left[\begin{array}{ccc}
f_x & s & c_x \\
0 & f_y & c_y \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{llll}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]=\left[\begin{array}{cccc}
f_x & s & c_x & 0 \\
0 & f_y & c_y & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]
$$

 

 

가정 3

  • 카메라가 어떠한 회전도 없이 정면을 바라보고 있다.
  • 카메라가 원점 (0, 0, 0)에 존재한다.
  • 이미지 좌표축이 수직이다. 

 

가정 2까지는 카메라 외부 파라미터에 대한 제약이었다면 가정 3부터는 카메라 내부 파라미터에 대한 제약이 추가되었습니다.

이미지 좌표축이 수직이지 않다는 것은 정확히는 이미지 센서의 cell array의 y축이 기울어졌다는 의미인데요.

이 기울어진 정도를 skew 파라미터로 나타냅니다.

s(skew)  = tan$\alpha$

 

< 그림 3 >

 

이미지 좌표축이 수직이라면 skew 값은 0이 되겠죠.

수식에서는 skew error를 조정하던 s가 0이 됩니다.

(요즘 생산되는 카메라 들은 skew error가 없어서 skew 파라미터까지 고려하지는 않는다고 합니다.)

 

<식 4>

$$
w\left[\begin{array}{l}
u \\
v \\
1
\end{array}\right]=K[\boldsymbol{R}, t]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]=\left[\begin{array}{ccc}
f x & 0 & c_x \\
0 & f_y & c_y \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{llll}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]=\left[\begin{array}{cccc}
f_x & 0 & c_x & 0 \\
0 & f_y & c_y & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]
$$

 

 

가정 4

  • 카메라가 어떠한 회전도 없이 정면을 바라보고 있다.
  • 카메라가 원점 (0, 0, 0)에 존재한다.

  • 이미지 좌표축이 수직이다. 
  • 픽셀의 가로 세로 비율이 동일하다.

 

그림 3에서의 $P_x, P_y$가 픽셀의 크기를 의미하고 수식에서의 $f_x, f_y$는 초점거리($F$)에 픽셀 크기를 나눈 값입니다.

$f_x = F/P_x$

$ f_y = F/P_y$

픽셀의 aspect ratio가 1:1이라는 제약이 추가되면서 $f_x$와 $f_y$는 같은 값을 가지게 됩니다.

 

< 식 5 >

$$
w\left[\begin{array}{l}
u \\
v \\
1
\end{array}\right]=\boldsymbol{K}[\boldsymbol{R}, t]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]=\left[\begin{array}{ccc:c}
f & 0 & c_x \\
0 & f & c_y \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{cccc}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]=\left[\begin{array}{cccc}
f & 0 & c_x & 0 \\
0 & f & c_y & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]
$$

 

 

가정 5

  • 카메라가 어떠한 회전도 없이 정면을 바라보고 있다.
  • 카메라가 원점 (0, 0, 0)에 존재한다.

  • 이미지 좌표축이 수직이다. 
  • 픽셀의 가로 세로 비율이 동일하다.
  • Principle point가 (0, 0)에 위치한다.

 

카메라의 렌즈와 이미지센서가 어긋나게 되면 이제 광축과 이미지 센서가 만나는 principle point가 이미지 센서의 중심에서 벗어나게 됩니다.

이를 중심에 맞게 보정하기 위해서 $c_x, c_y$ 파라미터가 사용됩니다.

principle point가 이미지 센서의 중심에 위치한다는 제약이 있다면 중심 좌표를 이동시킬 필요가 없어지기 때문에 $c_x, c_y$는 모두 0이 됩니다.

 

< 식 6 >

$$
w\left[\begin{array}{l}
u \\
v \\
1
\end{array}\right]=\boldsymbol{K}[\boldsymbol{R}, t]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]=\left[\begin{array}{lll}
f & 0 & 0 \\
0 & f & 0 \\
0 & 0 & 1
\end{array}\right]\left[\begin{array}{llll}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{l}
x \\
y \\
z \\
1
\end{array}\right]=\left[\begin{array}{llll}
f & 0 & 0 & 0 \\
0 & f & 0 & 0 \\
0 & 0 & 1 & 0
\end{array}\right]\left[\begin{array}{c}
x \\
y \\
z \\
1
\end{array}\right]=\left[\begin{array}{c}
f x \\
f y \\
z
\end{array}\right]=z\left[\begin{array}{c}
f x / z \\
f y / z \\
1
\end{array}\right]
$$

 

 

이렇게 해서 여러 상황에 대한 카메라 모델을 알아봤습니다.

실제로 문제가 주어졌을 때 해당 task에서 주어질 수 있는 제약이 어떤 것이 있는지를 고려하면서 카메라 모델을 설계하고 문제를 풀어나가면 조금 더 쉽게 해결할 수 있을 거라 생각합니다.

다음에는 수식에서 사용된 각 파라미터들을 구하는 방법(Camera calibration)에 대해서 정리해 보겠습니다.

 

 

[ Reference ]

https://kr.mathworks.com/help/vision/ug/camera-calibration.html

https://darkpgmr.tistory.com/32#calibration2

https://carstart.tistory.com/179

728x90

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

[Vision Geometry] 5가지 2D Transformations 정리  (0) 2023.05.25