[Vision] 원근 투영(Perspective Projection)과 Lens Distortion Model

JeongMin·2023년 10월 14일
0

ComputerVision

목록 보기
1/9

원근 투영(Perspective Projection)


카메라 모델이 위와 같다고 할 때 image plane을 z축에 대해 원점 대칭이동시켜서 아래와 같이 생각할 수 있다.

이때 원래 image plane의 좌표 상하좌우가 뒤집힌 상태이다.

실제 세상의 좌표 (x,y,z)가 image plane에 (u', v')으로 투영된다.


f: 초점거리일때, image plane상의 u=fxzu'=\frac{fx}{z}이다.

(z:x=f:uz:x = f:u')

vv'도 마찬가지로 v=fyzv'=\frac{fy}{z}

현실좌표를 원점이 광축이 지나가는 점인 image plane에 투영

실제세계의 좌표 (x,y,z)T(x,y,z)^T를 이미지에 투영시켰을 때 (u,v)=(fxz,fyz)(u', v')=(\frac{fx}{z},\frac{fy}{z})이고, 이를 동차좌표계를 사용하여 나타내면 다음과 같다.

(xyz1)(UVS)=(fxfyz)=(f0000f000010)(xyz1)\begin{pmatrix}x\\y\\z\\1 \end{pmatrix} \rightarrow \begin{pmatrix} U'\\V'\\S' \end{pmatrix}=\begin{pmatrix}fx\\fy\\z\end{pmatrix}=\begin{pmatrix}f&0&0&0 \\ 0&f&0&0\\0&0&1&0\end{pmatrix}\begin{pmatrix}x\\y\\z\\1\end{pmatrix}
u=US,v=VS,S=zu'=\frac{U'}{S'}, v'=\frac{V'}{S'}, S'=z

동차좌표계란 원래의 좌표에 한차원을 추가한 좌표계이다.

(xyz1)\begin{pmatrix}x\\y\\z\\1 \end{pmatrix}에서 1은 scale term인데, 이 scale term으로 해당 점의 행렬을 나눠주거나 곱해주면 투영했을 때 같은 점으로 투영되는 점들이 나온다.


예를 들어, (3633)\begin{pmatrix}3\\6\\3\\3 \end{pmatrix}에서 마지막의 3이 scale term이고, 3으로 나눠주면(1211)\begin{pmatrix}1\\2\\1\\1 \end{pmatrix}이 되고 다시 2를 곱해주면 (2422)\begin{pmatrix}2\\4\\2\\2 \end{pmatrix}가 된다. 그리고 초점거리ff가 1이라고 하면, 이들은 모두 투영된 이미지의 (1,2)에 투영되는 것이다.

식을 다시 써보면, (UVS)=[f000f0001][100001000010](xyz1)\begin{pmatrix}U'\\V'\\S'\end{pmatrix}=\begin{bmatrix}f&0&0\\0&f&0\\0&0&1\end{bmatrix}\begin{bmatrix}1&0&0&0\\0&1&0&0\\0&0&1&0\end{bmatrix}\begin{pmatrix}x\\y\\z\\1\end{pmatrix}로 쓸 수 있고, 다음과 같이 나타낼 수 있다.

U~=PXc~\tilde{U}=P\tilde{X_c}
P=diag(f,f,1)[I0]P=diag(f,f,1)\begin{bmatrix}I&&0\end{bmatrix}

좌상 원점 좌표계로 변환

위에서는 현실세계의 좌표를 카메라의 광축(optical point)를 지나는 점을 원점으로 하는 image plane에 투영시켰다. (u,v)(u',v')
영상처리에서는 왼쪽 위를 원점으로하는 좌상 원점 좌표를 주로 사용하기 때문에 이에 대한 변환이 필요하다. (u,v)(u, v)

(u,v)=(u+u0,v+v0)=(US+u0,VS+v0)(u,v)=(u'+u_0, v'+v_0)=(\frac{U'}{S'}+u_0, \frac{V'}{S'}+v_0)

이를 동차 좌표계로 나타내보자.

(UVS)=(uSvSS)=((u+u0)S(v+v0)SS)=[f0u00fv0001][100001000010](xyz1)\begin{pmatrix}U\\V\\S\end{pmatrix}=\begin{pmatrix}uS\\vS\\S\end{pmatrix}=\begin{pmatrix}(u'+u_0)S\\(v'+v_0)S\\S\end{pmatrix} = \begin{bmatrix}f&0&u_0\\0&f&v_0\\0&0&1\end{bmatrix}\begin{bmatrix}1&0&0&0\\0&1&0&0\\0&0&1&0\end{bmatrix}\begin{pmatrix}x\\y\\z\\1\end{pmatrix}
U~=A[I0]Xc~\tilde{U} = A[I0]\tilde{X_c}
A=[f0u00fv0001]A=\begin{bmatrix}f&0&u_0\\0&f&v_0\\0&0&1\end{bmatrix}

이때 A는 camera matrix로, intrinsic parameter로 구성되어있다.

intrinsic parameter는 카메라 렌즈와 센서에 의해 결정되는 값들로, 카메라마다 다른값을 가지고 있다고 생각하면 될 것같다.

좌표계의 회전과 이동

지금까지 현실세게 좌표라고 불렀던 XcX_c는 사실 카메라가 바라본 현실세계의 좌표이다. 카메라가 기울어졌다면 XcX_c도 현실의 어떤 기준좌표계에 대해 기울어졌을 것이다.

Xc~=[Rt]Xw~\tilde{X_c}=\begin{bmatrix}R&t\\\end{bmatrix}\tilde{X_w}

Xc~\tilde{X_c}가 Camera Coordinate, Xw~\tilde{X_w}가 World Coordinate이다.
U~=A[I0]Xc~\tilde{U} = A[I0]\tilde{X_c} 이었으므로,

U~=A[Rt]Xw~\tilde{U} = A\begin{bmatrix}R&t\\\end{bmatrix}\tilde{X_w}

Camera Matrix

위에서 camera matrix는 A=[f0u00fv0001]A=\begin{bmatrix}f&0&u_0\\0&f&v_0\\0&0&1\end{bmatrix}라고 했는데, 이를 그대로 사용하면 World Coordinate에서 투영된 이미지 좌표로 변환하는데 있어서 이미지의 단위는 pixel이고 현실에서의 거리 단위는 mm or m이기 때문에 문제가 생긴다.

이를 해결하기 위해 mm 단위를 pixel로 바꿔주는 행렬을 앞에 곱해주게 된다.

A=[ku000kv0001][f0u00fv0001]=[αu0kuu00αvkvv0001]A=\begin{bmatrix}k_u&0&0\\0&k_v&0\\0&0&1\end{bmatrix}\begin{bmatrix}f&0&u_0\\0&f&v_0\\0&0&1\end{bmatrix}=\begin{bmatrix}\alpha_u&0&k_uu_0\\0&\alpha_v&k_vv_0\\0&0&1\end{bmatrix}

최종적으로

U~=PXw~\tilde{U}=P\tilde{X_w}
P=A[Rt]P=A\begin{bmatrix}R&t\\\end{bmatrix}
A=[α0kuu00βkvv0001]A=\begin{bmatrix}\alpha&0&k_uu_0\\0&\beta&k_vv_0\\0&0&1\end{bmatrix}

Lens Distortion Model

카메라 렌즈에 의해 실제 사물보다 이미지에서 왜곡이 생긴다. 이를 보정하는 모델이 있다.

Brown Model

u=ud+(udu0)(k1r2+k2r4)+tangential termu = u_d+(u_d-u_0)(k_1r^2+k_2r^4)+tangential \ term
v=vd+(vdv0)(k1r2+k2r4)+tangential termv = v_d+(v_d-v_0)(k_1r^2+k_2r^4)+tangential \ term

(u,v)(u,v): 왜곡되지 않은 이미지의 좌표
(ud,vd)(u_d,v_d): 왜곡된 이미지의 좌표
rx=(udu0)αu,rt=(vdv0)αvr_x=\frac{(u_d-u_0)}{\alpha_u}, r_t=\frac{(v_d-v_0)}{\alpha_v}
r=rx2+ry2r=\sqrt{r_x^2+r_y^2}

Fitzgibborn Model

브라운 모델보다 정확하다고 한다.
s(rxry1)=R(xwywzw)+(txtytz),r=rx2+ry2s\begin{pmatrix}r_x\\r_y\\1\end{pmatrix}=R\begin{pmatrix}x_w\\y_w\\z_w\end{pmatrix}+\begin{pmatrix}t_x\\t_y\\t_z\end{pmatrix}, r=\sqrt{r_x^2+r_y^2}

1.(udvd1)=A(rx(1+k1r2+k2r4)ry(1+k1r2k2r4)1)1. \begin{pmatrix}u_d\\v_d\\1\end{pmatrix} = A\begin{pmatrix}r_x(1+k_1r^2+k_2r^4)\\r_y(1+k_1r^2k_2r^4)\\1\end{pmatrix}

2.udu0=(uu0)(1+k1r2+k2r4)+tangential term2. u_d -u_0 = (u-u_0)(1+k_1r^2+k_2r^4)+tangential \ term
vdv0=(vv0)(1+k1r2+k2r4)+tangential termv_d-v_0 =(v-v_0)(1+k_1r^2+k_2r^4)+tangential \ term

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

0개의 댓글

관련 채용 정보