카메라 캘리브레이션은 카메라 변수로 부터 시작된다.
다시 식을 적어보자면, 이미지에 투영된 점의 동차좌표(Homogeneous coordinate)를 U~라고 하고 현실의 동차 좌표를 xw~라고 하면 다음과 같은 수식을 적을 수 있다.
U~=A[R∣t]xw~
A=⎣⎢⎡α00γβ0u0v01⎦⎥⎤
A는 카메라 내부 변수로, 초점거리(α,β), 비대칭 계수(γ), 카메라 이미지 평면의 원점(u0,v0)를 포함한다.
전통적인 Camera Calibration 방법
전통적인 방법은 3D 좌표를 알 수 있는 큐브등의 도구를 사용하는 것이다.
하지만 이는 높은 정밀도를 요구하며 따라서 비용이 많이 들고, 유연하지 못하다는 단점이 있다.
Zhang's Method
Zhang's Method에서는 3D 물체가 아닌 평면을 사용한다.
종이에 패턴을 프린트하여 카메라에 여러 구도로 몇번 비추면 파라미터를 추정할 수 있다.
장점은 싸고, 유연하며 Robust라는 것이다.
원래 world 좌표에서 카메라 이미지 plane에 투영되는 과정의 수식은 다음과 같다.
s⎣⎢⎡uv1⎦⎥⎤=⎣⎢⎡α00γβ0u0v01⎦⎥⎤[r1r2r3t]⎣⎢⎢⎢⎡xyz1⎦⎥⎥⎥⎤

zhang's method에서는 평면 이미지를 사용하여 캘리브레이션하기 떄문에 z=0 이라고 가정한다. 그러면 다음과 같이 수식이 수정된다.
s⎣⎢⎡uv1⎦⎥⎤=⎣⎢⎡α00γβ0u0v01⎦⎥⎤[r1r2t]⎣⎢⎡xy1⎦⎥⎤
sm~=HM~, H=A[r1r2t]
여기서 H는 Homography라고 하며, Homograpy를 추정하여 카메라 파라미터들을 추정할 수 있다.
Homography의 추정
위의 식을 다음과 같이 나타내보겠다.
⎣⎢⎡sx′sy′s⎦⎥⎤=⎣⎢⎡adgbehcfi⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤
p′,p는 알고 있는 값이며 모르는 변수인 H를 추정하게 된다.
1. 선형방정식 설정
p′=Hp를 ∣∣Ah∣∣=0 (∣∣h∣∣=1,h=[a,b,c,…,i]T) 꼴로 만들어 푼다.
우선 양번에 sp′을 외적한다.
sp′×p′=sp′×Hp
0=p′×Hp
p′×는 skew(p′)으로 바꿔 표현할 수 있고, 다음과 같이 전개할 수 있다.
p′×Hp=skew(p′)Hp=⎣⎢⎡01−y′−10x′y′−x′0⎦⎥⎤⎣⎢⎡h1Th2Th3T⎦⎥⎤⎣⎢⎡xy1⎦⎥⎤=⎣⎢⎡01−y′−10x′y′−x′0⎦⎥⎤⎣⎢⎡h1Tph2Tph3Tp⎦⎥⎤=⎣⎢⎡−h2Tp+h3Tpy′h1Tp−h2Tpx′−h1Tpy′+h2Tpx′⎦⎥⎤=⎣⎢⎡0TpT−ypT−pT0Tx′pTy′pT−x′pT0T⎦⎥⎤⎣⎢⎡h1h2h3⎦⎥⎤=0
Ah=0꼴로 만들었는데, 여기서 A는 3×9행렬이고 h는 9×1행렬이다.
h1T는 H의 첫번째 행이고 따라서
h1T=[abc]h1T=[def]h1T=[ghi]
가 된다.
2. N개의 이미지에서 얻은 A를 행으로 배열
캘리브레이션을 위해 찍은 이미지가 여러장이므로 N장의 이미지에서 얻은 A를 행으로 배열해서 최종 A를 얻는다. 여기서 A는 카메라 내부 파라미터가 아닌 1번에서 설정한 선형방정식 Ah=0을 풀기위한 A이다.
A=⎣⎢⎢⎢⎡A1A2…AN⎦⎥⎥⎥⎤
3. A=USVT(Singluar Value Decomposition)
2에서 구한 행렬 A에 SVD(특이값 분해)를 적용한다.
4. h는 V의 마지막열
A를 특이값 분해하여 나온 USVT에서 V의 마지막 열이 h가 된다.
b와 v 행렬 구하기
H=[h1h2h3]
[h1h2h3]=λA[r1r2r3]
(A는 카메라 내부 파라미터)
여기서 사용할 h1,h2,h3 은 위에서와 다르게 H의 열벡터이다.
hi=[h1ih2ih3i]T
한쪽변에 [R t]만 남겨놓는다고 하면 λ1A−1[h1h2h3]=[r1r2r3]이고, ri=λ1A−1hi이다. ---(식1)
그리고 r1,r2의 직교성에서 부터 한 이미지에서 다음 두 식을 얻을 수 있다.
1. r1⋅r2=r1T⋅r2=02. ∣∣r1∣∣2=∣∣r2∣∣2
이 두식에 식1을 대입하면 다음 두 수식을 얻을 수 있다.
h1TA−TA−1h2=0⇢(식2)h1TA−TA−1h1=h2TA−TA−1h2⇢(식3)
우선 B=A−TA−1=⎣⎢⎡B11B21B31B12B22B32B13B23B33⎦⎥⎤이라고 하자.
B는 대칭행렬이므로 b=[B11B12B22B13B23B33]을 알면 B 행렬을 알 수 있다.
(∗XTX는 대칭행렬)
hiTBhj=vijTb로 쓸 수 있고,
vij=[h1ih1jh1ih2j+h2ih1jh2ih2jh3ih1j+h1ih3jh3ih2j+h2ih3jh3ih3j]T
[v12T(v11−v22)T]b=0→Vb=0
Vb=0의 해는 VTV의 가장 작은 고유값으로 구성된 고유벡터이다.
내부 파라미터
B=λA−TA−1로 부터 내부 파라미터를 구할 수 있고 다음과 같다.
v0=B11B22−B122B12B13−B11B23λ=B33−B11B132+v0(B12B13−B11B23)α=B11λ,β=B11B22−B122λB11γ=−λB12α2β,u0=αγv0−λB13α2
외부 파라미터
H=[h1h2h3]=λA[r1r2r3]로 부터 외부 파라미터를 구할 수 있다.
r1=λA−1h1r2=λA−1h2r3=r1×r2t=λA−1h3
λ=∣∣A−1h1∣∣1=∣∣A−1h2∣∣1
현실 좌표에서 이미지
Xw에 외부 파라미터(R,t)를 적용하면 카메라 좌표(Xc)를 얻을 수 있고, 내부파라미터를 적용하면 이미지 좌표(U)를 얻을 수 있고, 렌즈 왜곡을 적용하면 최종적으로 Ud를 얻을 수 있다.
Fine-Tunning
A,R,t,k를 구할 수 있고, 회전 행렬을 Euler Angle로 변환하면 14개의 변수를 다음과 같이 표현할 수 있다.
(A,R),(t,k)i=(α,β,γ,u0,v0,k1,k2),(ψ,θ,ϕ,tx,ty,tz)i, (i=1,…,N)
N개의 이미지로 부터 구한 내부 파라미터와 외부 파라미터를 Fine-Tunning를 하기 위해 cost function을 정의한다.
Error=i=1∑Nk=1∑Ki∣∣fik−pi(xw(k),yw(k))∣∣
N은 이미지 개수, Ki는 feature의 개수, fik는 i번째 이미지의 k번째 feature, pi(xw(k),yw(k))는 i번째 이미지의 투영이다.
이런 cost function을 가지고 Nonlinear optimization을 하면 Camera calibration이 끝난다.