앞선 글에서 카메라 파라미터를 정의하였으며, 이를 통해 3D 상에 있는 객체를 카메라 영상인 2D에 매핑할 수 있었다. 하지만 이러한 연산을 하려면 각 파라미터의 수치를 알아내어야 하는데 그 방법을 카메라 캘리브레이션(calibration)이라고 한다. 캘리브레이션 방법에는 여러가지가 있지만 여기서는 다음의 두가지 방법을 알아본다.
3D 상에 있는 객체를 2D 카메라 영상에 매핑하는 식은 다음과 같았다.
ximage=⎝⎜⎛αx00sαy0px′py′1⎠⎟⎞[I∣0](R0−RC1)Xworld=⎝⎜⎛αx00sαy0px′py′1⎠⎟⎞[R∣−RC]Xworld=K[R∣−RC]Xworld=KR[I∣−C]Xworld=PXworld
카메라 캘리브레이션의 목표는 K (5 parameter), R (3 parameter), C (3 parameter) 등의 내부 또는 외부 등의 파라미터를 찾아내는 것이며, 보통 위와 같이 11개의 파라미터를 결정한다 (사실 굳이 각 파라미터를 구할 필요가 없고 매핑 자체에만 관심이 있다면 P만 구해도 되며 이 경우 풀이가 더 간결해질 수 있다.).
DLT(Direct Linear Transform)을 사용하는 방법에서는 위와 같이 매핑 식을 하나의 행렬 P로 두어 DLT를 통해 행렬 P를 구하고 이로 부터 각 카메라 파라미터를 찾는다. 행렬 P를 이용하면 다음과 같이 적을 수 있다.
ximage=PXworld=⎝⎜⎛p11p21p31p12p22p32p13p23p33p14p24p34⎠⎟⎞Xworld=⎝⎜⎛ATBTCT⎠⎟⎞Xworld
xi=PXi→⎝⎜⎛xiyi1⎠⎟⎞=⎝⎜⎛ATBTCT⎠⎟⎞Xi=⎝⎜⎛ATXiBTXiCTXi⎠⎟⎞
위의 식은 homogeneous coodinate로 쓰여진 식이며, 다음과 같이 정리할 수 있다.
{xi=CTXiATXi→−ATXi+xiCTXi=0yi=CTXiBTXi→−BTXi+yiCTXi=0
이때, 다음과 같이 axiT,ayiT을 사용하면, 각각의 식을 행렬 P의 원소들로 생성한 벡터 p와의 곱으로 표현할 수 있다.
{axiT=(−XiT,0T,xiXiT)=(−Xi,−Yi,−Zi,−1,0,0,0,0,xiXi,xiYi,xiZi,xi)ayiT=(0T,−XiT,yiXiT)=(0,0,0,0,−Xi,−Yi,−Zi,−1,yiXi,yiYi,yiZi,yi)
{xi=CTXiATXi→−ATXi+xiCTXi=axiTp=0yi=CTXiBTXi→−BTXi+yiCTXi=ayiTp=0
여기서 우리는 하나의 점을 매핑함으로써 2개의 식을 얻을 수 있음을 보았으며, 얻고자 하는 파라미터는 11개이므로 최소한 6개의 점을 사용하여 식을 모아야한다. 이 과정을 통해 여러개의 axiT,ayiT를 모을 수 있으며, 이 벡터들을 쌓아서 하나의 행렬을 만듦으로써 여러개의 점을 하나의 식으로 표현이 가능하다 (다만 모든 Zi가 0이 되는 것과 같이 선택한 모든 점이 한 평면 위에 있다면 행렬 M의 랭크가 줄어 적합한 식이 세워지지 않는다).
⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛ax1Tay1Tax2Tay2T⋮axiTayiT⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞p=Mp=0
이제 위의 식을 풀어 p를 구해야 하는데 행렬 M은 점들의 3D/2D 위치를 기반으로 구성되어 있으므로 당연히 어느정도의 노이즈를 포함하고 있다. 따라서 대부분의 경우 Mp=0를 정확히 만족하는 p를 구할 수 없으며, ∣Mp∣를 최소로하는 p를 찾는 최소제곱법을 풀게되며, 앞선 글에서 보았듯이 그 해는 M의 가장 작은 특이값에 대응되는 오른쪽 특이벡터이다.
이러한 방법으로 행렬 P를 구하였으며, 이제 행렬 P로부터 파라미터 K,R,C를 복원해야 한다.
P=⎝⎜⎛p11p21p31p12p22p32p13p23p33p14p24p34⎠⎟⎞=⎝⎜⎛p11p21p31p12p22p32p13p23p33p14p24p34⎠⎟⎞=(H∣h)=(KR∣−KRC)
H=KRh=−KRC
이때, K는 삼각행렬, R은 회전변환행렬로써 정규직교한다. H−1=R−1K−1=(정규직교행렬)(삼각행렬)이며, 따라서 H−1를 QR decomposition하여 K,R를 구할 수 있다. 이때, 이들은 homogenous이므로 K를 K33로 나누어 nomalize할 수도 있다. 카메라 중심 C는 −H−1h로 구할 수 있다.
2. Zhang's Method
Zhang's method 또한 calibration을 위한 방법 중에 하나이며, 아래와 같은 checker board를 사용하는 방식이다. Checker board는 아래와 같이 특징점을 찾기 쉬운 패턴으로 되어 있으며, 각 격자 간의 거리는 사전에 정의되어 있기 때문에 특징점의 3d 좌표를 알아낼 수 있다(world 좌표의 원점이 checker board의 코너 쪽에 위치해있다고 가정하는 등).

Figure 1. Calibration board
이때, 추출된 모든 점이 한 평면 위에 위치하므로 Z=0으로 두어 다음과 같이 매핑식을 간소화 할 수 있다.
→→⎝⎜⎛xy1⎠⎟⎞=⎝⎜⎛αx00sαy0px′py′1⎠⎟⎞⎝⎜⎛r11r21r31r12r22r32r13r23r33t1t2t3⎠⎟⎞⎝⎜⎜⎜⎛XYZ1⎠⎟⎟⎟⎞⎝⎜⎛xy1⎠⎟⎞=⎝⎜⎛αx00sαy0px′py′1⎠⎟⎞⎝⎜⎛r11r21r31r12r22r32t1t2t3⎠⎟⎞⎝⎜⎛XY1⎠⎟⎞x=HX
이때, H는 8 DoF를 갖고, DLT와 비슷한 방식으로 최소 4개의 점(점 하나당 두 개의 식이 나옴)을 이용하여 H를 구할 수 있다(SVD).
H=(h1,h2,h3)=⎝⎜⎛αx00sαy0px′py′1⎠⎟⎞⎝⎜⎛r11r21r31r12r22r32t1t2t3⎠⎟⎞=K(r1,r2,t)
하지만 위에서 일부 원소가 생략(r13,r23,r33)되었으므로 더이상 rij들이 회전행렬을 이룬다고 할 수 없으며, QR decomposition은 적용할 수 없다. 따라서 위의 식이 만족해야만 하는 두 가지 제약조건을 통해 다른 방법을 적용하여 내부파라미터 K를 찾는다.
위의 식에서 (r1,r2,t)=K−1(h1,h2,h3)이고, 따라서 r1=K−1h1,r2=K−1h2이다. 이때, r1,r2가 orthonormal 하다는 점에서 다음의 두가지 제약조건이 발생한다.
r1Tr2=0,∣r1∣=∣r2∣=0
∣Ax∣=Ax⋅Ax=(Ax)TAx=xTATAx에서 norm을 나타내는 표현과 dot product가 있을때 행렬에 transpose가 붙음을 알 수 있다. 따라서 위 제약조건은 다음과 같다.
r1Tr2=0→h1TK−TK−1h2=0∣r1∣=∣r2∣=0→h1TK−TK−1h1=h2TK−TK−1h2→h1TK−TK−1h1−h2TK−TK−1h2=0
여기서 우리가 구하고자 하는 K로 이루어진 K−TK−1를 B로 두자. 이때, K−TK−1는 양의 정부호 행렬이다(대칭행렬(transpose와 원래 행렬의 곱)이고, h1TK−TK−1h1=h1TBh1=∣r1∣에서 볼 수 있듯이 norm을 의미하는 식이 되어 h1=0라면 항상 양수). 또한 K가 상삼각행렬이므로, K−T,K−1 또한 상삼각행렬이고, 따라서 B에 Cholesky decomposition를 적용하여 K를 구할 수 있다.
다만, 아직 행렬 B는 unknown이므로 위 제약조건을 적용하여 행렬 B의 원소들을 구해야한다. Unknown인 행렬 B의 원소들을 모아 벡터 b=(b11,b12,b13,b22,b23,b33)을 구성할 수 있다. 여기서 unknown이 6개 뿐인 이유는 행렬 B가 대칭행렬이기 때문이다. 이제 벡터 vij를 다음과 같이 정의해보자.
vij=⎝⎜⎜⎜⎜⎜⎜⎜⎛h1ih1jh1ih2j+h2ih1jh3ih1j+h1ih3jh2ih2jh3ih2j+h2ih3jh3ih3j⎠⎟⎟⎟⎟⎟⎟⎟⎞
이때, 첫번째 제약조건 h1TK−TK−1h2=0은 v12Tb=0으로, 두번째 제약조건 h1TK−TK−1h1−h2TK−TK−1h2=0은 v11Tb−v22Tb=0로 쓸 수 있다(이는 제약조건 식들을 직접 전개해보면 알 수 있음).
따라서 하나의 이미지로부터 다음과 같은 식을 세울 수 있으며, 6개의 미지수를 구하기 위해 최소 3장의 이미지를 촬영해 식을 세우고 DLT에서 사용한 SVD를 통해 행렬 B를 구할 수 있다.
(v12Tv11T−v22T)b=0,→⎝⎜⎜⎜⎜⎜⎜⎛v12,1Tv11,1T−v22,1T⋮v12,nTv11,nT−v22,nT⎠⎟⎟⎟⎟⎟⎟⎞b=0
3. Distortion
앞에서 우리들은 카메라 파라미터를 이용하여 3D 상의 점을 2D의 카메라 영상으로 매핑할 수 있었다. 하지만 실제 카메라를 보면 이러한 파라미터로 계산된 위치 (x,y)와는 다른 위치에 매핑이 되는데, 이는 카메라 파라미터를 행렬을 통해 곱하는 것처럼 linear한 방식으로 나타낼 수 없는 non-linear한 요소가 존재하기 때문이다. 이러한 요소에는 여러가지가 있지만, 가장 대표적인 것은 렌즈에 의한 왜곡(distortion)이며, 아래와 같이 렌즈 가장자리에서 영상이 휘어지는 등의 왜곡이 있다.

Figure 2. 렌즈 왜곡
이러한 왜곡을 모델링하는 방법 또한 여러가지가 있지만, 대표적인 방법으로는 다음과 같은 barrel distortion 모델이 있다.
{xa=x+Δx(x,q)=x(1+q1r2+q2r4)ya=y+Δy(x,q)=y(1+q1r2+q2r4)
여기서 사용된 non-linear parameter인 q1,q2를 구하여 왜곡을 제거할 수도 있으며, 이를 구하기 위해 실제 촬영된 영상에서 나타난 점의 위치와 위 왜곡모델로 계산된 점의 위치 사이의 차이를 최소화 하는 최소제곱법이 사용된다. 다만 이를 풀기 위해서는 Levenberg-Marquardt 방법 등의 non-linear 최적화 방법이 사용되어야 한다.