[Vision] Camera Calibration(Zhang's Method)

JeongMin·2024년 4월 17일
0

ComputerVision

목록 보기
6/9

카메라 캘리브레이션은 카메라 변수로 부터 시작된다.

다시 식을 적어보자면, 이미지에 투영된 점의 동차좌표(Homogeneous coordinate)를 U~\tilde U라고 하고 현실의 동차 좌표를 xw~\tilde {x_w}라고 하면 다음과 같은 수식을 적을 수 있다.

U~=A[Rt]xw~\tilde U = A[R |t]\tilde {x_w}
A=[αγu00βv0001]A=\begin{bmatrix} \alpha & \gamma & u_0 \\ 0 & \beta & v_0 \\ 0 & 0 & 1 \end{bmatrix}

AA는 카메라 내부 변수로, 초점거리(α,β\alpha, \beta), 비대칭 계수(γ\gamma), 카메라 이미지 평면의 원점(u0,v0u_0, v_0)를 포함한다.

전통적인 Camera Calibration 방법

전통적인 방법은 3D 좌표를 알 수 있는 큐브등의 도구를 사용하는 것이다.
하지만 이는 높은 정밀도를 요구하며 따라서 비용이 많이 들고, 유연하지 못하다는 단점이 있다.

Zhang's Method

Zhang's Method에서는 3D 물체가 아닌 평면을 사용한다.

종이에 패턴을 프린트하여 카메라에 여러 구도로 몇번 비추면 파라미터를 추정할 수 있다.

장점은 싸고, 유연하며 Robust라는 것이다.

원래 world 좌표에서 카메라 이미지 plane에 투영되는 과정의 수식은 다음과 같다.

s[uv1]=[αγu00βv0001][r1r2r3t][xyz1]s \begin{bmatrix} u \\ v \\1 \end{bmatrix} = \begin{bmatrix} \alpha & \gamma & u_0 \\ 0 & \beta & v_0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} r_1 & r_2 & r_3 & t \end{bmatrix} \begin{bmatrix}x\\y\\z\\1 \end{bmatrix}

zhang's method에서는 평면 이미지를 사용하여 캘리브레이션하기 떄문에 z=0z=0 이라고 가정한다. 그러면 다음과 같이 수식이 수정된다.

s[uv1]=[αγu00βv0001][r1r2t][xy1]s \begin{bmatrix} u \\ v \\1 \end{bmatrix} = \begin{bmatrix} \alpha & \gamma & u_0 \\ 0 & \beta & v_0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} r_1 & r_2 & t \end{bmatrix} \begin{bmatrix}x\\y\\1 \end{bmatrix}
sm~=HM~, H=A[r1r2t]s\tilde m = H \tilde M, \ H=A\begin{bmatrix}r_1 & r_2 & t\end{bmatrix}

여기서 HH는 Homography라고 하며, Homograpy를 추정하여 카메라 파라미터들을 추정할 수 있다.

Homography의 추정

위의 식을 다음과 같이 나타내보겠다.

p=Hpp'=Hp
[sxsys]=[abcdefghi][xy1]\begin{bmatrix}sx'\\sy'\\s\end{bmatrix}=\begin{bmatrix} a&b&c\\ d&e&f\\ g&h&i \end{bmatrix} \begin{bmatrix} x\\y\\1 \end{bmatrix}

p,pp', p는 알고 있는 값이며 모르는 변수인 HH를 추정하게 된다.

1. 선형방정식 설정

p=Hpp'=HpAh=0 (h=1,h=[a,b,c,,i]T)||Ah||=0 \ (||h||=1, h=\begin{bmatrix} a,b,c,\dots ,i \end{bmatrix}^T) 꼴로 만들어 푼다.

우선 양번에 ps\frac{p'}{s}을 외적한다.

ps×p=ps×Hp\frac{p'}{s}\times p' = \frac{p'}{s} \times Hp
0=p×Hp0=p'\times Hp

p×p'\timesskew(p)skew(p')으로 바꿔 표현할 수 있고, 다음과 같이 전개할 수 있다.

p×Hp=skew(p)Hp=[01y10xyx0][h1Th2Th3T][xy1]=[01y10xyx0][h1Tph2Tph3Tp]=[h2Tp+h3Tpyh1Tph2Tpxh1Tpy+h2Tpx]=[0TpTypTpT0TxpTypTxpT0T][h1h2h3]=0p'\times Hp \\ = skew(p')Hp \\ =\begin{bmatrix} 0&-1&y'\\ 1& 0&-x'\\ -y'&x'&0 \end{bmatrix} \begin{bmatrix} h_1^T\\ h_2^T\\ h_3^T \end{bmatrix} \begin{bmatrix} x\\ y\\ 1 \end{bmatrix}\\ =\begin{bmatrix} 0&-1&y'\\ 1& 0&-x'\\ -y'&x'&0 \end{bmatrix} \begin{bmatrix} h_1^Tp\\ h_2^Tp\\ h_3^Tp \end{bmatrix}\\ =\begin{bmatrix} -h_2^Tp+h_3^Tpy'\\ h_1^Tp-h_2^Tpx'\\ -h_1^Tpy'+h_2^Tpx' \end{bmatrix} = \begin{bmatrix} 0^T&-p^T&y'p^T\\ p^T& 0^T&-x'p^T\\ -yp^T&x'p^T&0^T \end{bmatrix} \begin{bmatrix} h_1\\h_2\\h_3 \end{bmatrix}=0

Ah=0Ah=0꼴로 만들었는데, 여기서 AA3×93\times9행렬이고 hh9×19\times1행렬이다.

h1Th_1^THH의 첫번째 행이고 따라서

h1T=[abc]h1T=[def]h1T=[ghi]h_1^T=\begin{bmatrix} a&b&c \end{bmatrix}\\ h_1^T=\begin{bmatrix} d&e&f \end{bmatrix}\\ h_1^T=\begin{bmatrix} g&h&i \end{bmatrix}\\
가 된다.

2. N개의 이미지에서 얻은 A를 행으로 배열

캘리브레이션을 위해 찍은 이미지가 여러장이므로 N장의 이미지에서 얻은 A를 행으로 배열해서 최종 A를 얻는다. 여기서 A는 카메라 내부 파라미터가 아닌 1번에서 설정한 선형방정식 Ah=0Ah=0을 풀기위한 A이다.

A=[A1A2AN]A=\begin{bmatrix} A_1\\ A_2\\ \dots\\ A_N \end{bmatrix}

3. A=USVTA=USV^T(Singluar Value Decomposition)

2에서 구한 행렬 A에 SVD(특이값 분해)를 적용한다.

A=USVTA=USV^T

4. h는 V의 마지막열

A를 특이값 분해하여 나온 USVTUSV^T에서 VV의 마지막 열이 h가 된다.

b와 v 행렬 구하기

H=[h1h2h3]H=\begin{bmatrix} h_1 & h_2 & h_3 \end{bmatrix}
[h1h2h3]=λA[r1r2r3]\begin{bmatrix} h_1&h_2&h_3 \end{bmatrix}=\lambda A \begin{bmatrix} r_1&r_2&r_3 \end{bmatrix}

(AA는 카메라 내부 파라미터)
여기서 사용할 h1,h2,h3h_1, h_2, h_3 은 위에서와 다르게 HH의 열벡터이다.

hi=[h1ih2ih3i]Th_i=\begin{bmatrix} h_{1i} & h_{2i} & h_{3i} \end{bmatrix}^T




한쪽변에 [R t][R\ t]만 남겨놓는다고 하면 1λA1[h1h2h3]=[r1r2r3]\frac{1}{\lambda}A^{-1}\begin{bmatrix} h_1&h_2&h_3 \end{bmatrix}=\begin{bmatrix} r_1&r_2&r_3 \end{bmatrix}이고, ri=1λA1hir_i=\frac{1}{\lambda}A^{-1}h_i이다. ---(식1)

그리고 r1,r2r_1, r_2의 직교성에서 부터 한 이미지에서 다음 두 식을 얻을 수 있다.

1. r1r2=r1Tr2=02. r12=r221.\ r_1\cdot r_2=r_1^T \cdot r_2=0 \\ 2.\ ||r_1||^2 = ||r_2||^2

이 두식에 식1을 대입하면 다음 두 수식을 얻을 수 있다.

h1TATA1h2=0(2)h1TATA1h1=h2TATA1h2(3)h_1^TA^{-T}A^{-1}h_2=0 \dashrightarrow(식2)\\ h_1^TA^{-T}A^{-1}h_1=h_2^TA^{-T}A^{-1}h_2 \dashrightarrow(식3)




우선 B=ATA1=[B11B12B13B21B22B23B31B32B33]B=A^{-T}A^{-1}= \begin{bmatrix} B_{11} & B_{12} & B_{13} \\ B_{21} & B_{22} & B_{23} \\ B_{31} & B_{32} & B_{33} \\ \end{bmatrix}이라고 하자.

BB는 대칭행렬이므로 b=[B11B12B22B13B23B33]b=\begin{bmatrix} B_{11} & B_{12} & B_{22} & B_{13} & B_{23} & B_{33} \end{bmatrix}을 알면 BB 행렬을 알 수 있다.

(XTX*X^TX는 대칭행렬)

hiTBhj=vijTbh_i^TBh_j=v_{ij}^Tb로 쓸 수 있고,

vij=[h1ih1jh1ih2j+h2ih1jh2ih2jh3ih1j+h1ih3jh3ih2j+h2ih3jh3ih3j]Tv_{ij}=\begin{bmatrix} h_{1i}h_{1j} & h_{1i}h_{2j}+h_{2i}h_{1j} & h_{2i}h_{2j} & h_{3i}h_{1j}+h_{1i}h_{3j} & h_{3i}h_{2j}+h_{2i}h_{3j} & h_{3i}h_{3j} \end{bmatrix}^T
[v12T(v11v22)T]b=0Vb=0\begin{bmatrix} v_{12}^T \\ (v_{11}-v_{22})^T \end{bmatrix}b=0 \rightarrow Vb=0

Vb=0Vb=0의 해는 VTVV^TV의 가장 작은 고유값으로 구성된 고유벡터이다.

내부 파라미터

B=λATA1B=\lambda A^{-T}A^{-1}로 부터 내부 파라미터를 구할 수 있고 다음과 같다.

v0=B12B13B11B23B11B22B122λ=B33B132+v0(B12B13B11B23)B11α=λB11,β=λB11B11B22B122γ=B12α2βλ,u0=γv0αB13α2λv_0=\frac{B_{12}B_{13}-B_{11}B_{23}}{B_{11}B_{22}-B_{12}^2} \\ \lambda = B_{33}-\frac{B_{13}^2+v_0(B_{12}B_{13}-B_{11}B_{23})}{B_{11}}\\ \alpha = \sqrt{\frac{\lambda}{B_{11}}}, \beta=\sqrt{\frac{\lambda B_{11}}{B_{11}B_{22}-B_{12}^2}}\\ \gamma=-\frac{B_{12}\alpha^2\beta}{\lambda}, u_0=\frac{\gamma v_0}{\alpha}-\frac{B_{13}\alpha^2}{\lambda}

외부 파라미터

H=[h1h2h3]=λA[r1r2r3]H=\begin{bmatrix} h_1&h_2&h_3 \end{bmatrix}=\lambda A \begin{bmatrix} r_1&r_2&r_3 \end{bmatrix}로 부터 외부 파라미터를 구할 수 있다.

r1=λA1h1r2=λA1h2r3=r1×r2t=λA1h3r_1=\lambda A^{-1}h_1\\ r_2=\lambda A^{-1}h_2\\ r_3=r_1\times r_2\\ t=\lambda A^{-1}h_3
λ=1A1h1=1A1h2\lambda = \frac{1}{||A^{-1}h_1||}=\frac{1}{||A^{-1}h_2||}

현실 좌표에서 이미지

XwX_w에 외부 파라미터(R,tR, t)를 적용하면 카메라 좌표(XcX_c)를 얻을 수 있고, 내부파라미터를 적용하면 이미지 좌표(UU)를 얻을 수 있고, 렌즈 왜곡을 적용하면 최종적으로 UdU_d를 얻을 수 있다.

Fine-Tunning

A,R,t,kA, R, t, k를 구할 수 있고, 회전 행렬을 Euler Angle로 변환하면 14개의 변수를 다음과 같이 표현할 수 있다.

(A,R),(t,k)i=(α,β,γ,u0,v0,k1,k2),(ψ,θ,ϕ,tx,ty,tz)i, (i=1,,N)(A, R), (t, k)_i = (\alpha, \beta, \gamma, u_0, v_0,k_1,k_2), (\psi, \theta, \phi, t_x, t_y, t_z)_i,\ (i=1, \dots,N)

N개의 이미지로 부터 구한 내부 파라미터와 외부 파라미터를 Fine-Tunning를 하기 위해 cost function을 정의한다.

Error=i=1Nk=1Kifikpi(xw(k),yw(k))Error = \sum_{i=1}^N\sum_{k=1}^{K_i}||f_{ik}-p_i(x_w^{(k)},y_w^{(k)})||

NN은 이미지 개수, KiK_i는 feature의 개수, fikf_{ik}ii번째 이미지의 kk번째 feature, pi(xw(k),yw(k))p_i(x_w^{(k)},y_w^{(k)})ii번째 이미지의 투영이다.

이런 cost function을 가지고 Nonlinear optimization을 하면 Camera calibration이 끝난다.

profile
영상처리와 AI에 관심이 있는 학생입니다.

0개의 댓글

관련 채용 정보