Camera Parameter & Coordinate System Transformation

이전 핀홀 카메라 모델에서 카메라 파라미터를 구하기 위해서 카메라 캘리브레이션이라는 것을 해야한다고 했습니다. 그 카메라 캘리브레이션의 의미와 방법에 대해 조금 더 깊게 살펴볼게요.

들어가기전에 좌표계에 대해서 알아보죠. 일단 필요한 세가지 좌표계를 생각해볼 수 있습니다. 첫번째로 우리가 보는 실세계의 3차원 좌표계를 World coordinate system이라고 합니다. 그렇다면 이 Coordinate system의 기준이 되는 Origin과 서로 직교하는 3차원 축 방향을 마련해야겠죠? 이 것은 정하기 나름입니다만 보통 입력으로 들어오는 첫 프레임의 카메라 위치를 기준으로 정합니다.

그리고 두번째 좌표계는 각 프레임마다 카메라의 중심이 Origin이 되고 각 축을 만드는 Camera coordinate system이 있겠죠. 그럼 위에서 말한 것과 같이 첫 프레임은 카메라좌표계와 실세계 좌표계가 동일합니다. 그러면 두 번째 프레임 부터, 점 $P_c$을 Global coordinate로 옮길 땐 첫 프레임을 찍을 때보다 카메라가 얼만큼 움직였는지 알아내 그 만큼을 역으로 계산하면 됩니다.

마지막으로는 픽셀 좌표계입니다. 즉, 실제 World coordinate에서 Camera coordinate를 거쳐 다시 2차원 pixel로 맵핑 된 후의 좌표계입니다. 향후 SfM이나 SLAM등에서는 2차원 Pixel에서 3차원 World coordinate를 알아내는 과정을 진행함으로써 3D points cloud 혹은 volume을 생성해 냅니다.

이 좌표계 변환에서 유용하게 쓰일 뿐만아니라 이것이 전부 일 수 있는 Camera extrinsic (Rotation, Translation), Camera intrinsic을 살펴 보겠습니다.
Camera Coordinate System (출처 : http://kr.mathworks.com/help/vision/ug/camera-calibration.html)
Extrinsic은 World 좌표계에서 Camera 좌표계로 변환시키는 과정입니다. 이 때 파라미터는 Rotation(회전)과 Translation(평행이동)으로 구성되어 있습니다. 즉, 3D to 3D Rigid Transformation입니다.
$$
P_c = \begin{bmatrix}R_{3 \times 3} & T_{3 \times 1} \\ 0 & 1 \end{bmatrix}P_w
$$
반면 Intrinsic은 3D Camera coordinate에서 2D Pixel coordinate으로 Projective transformation시킨 것 입니다. 이 Transformation은 Pinhole camera model에 의해서 다음과 같은 변환관계가 있습니다.
$$
P'=\begin{bmatrix} \alpha & - \alpha cot \theta & u_o & 0 \\ 0 & \frac{\beta}{sin\theta} & v_o & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix}P_c
$$
여기서 $f$= focal length, $u_0,v_0$= offset , $\alpha, \beta \rightarrow$ non-square pixel, $\theta$=skew angle입니다. skew angle은 요즘 카메라에서 거의 일어나지 않아없다고 봐도 무방합니다.

그러므로 World-coordinate에서 Pixel-coordinate까지 최종 Transform은
$$
P' = MP_w=K\begin{bmatrix} R & T \end{bmatrix}P_w = \begin{bmatrix} \alpha & -\alpha cot\theta & u_o & 0 \\ 0 & \frac{\beta}{ sin\theta } & v_0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix}R & T \\ 0 & 1 \end{bmatrix}P_w
$$
입니다.

핀홀 카메라 모델

주변 센서 중에 가장 많이 이용되는 것 중 하나가 카메라인 것 같아요. 많은 데이터를 얻을 수 있으면서도 값도 싸고 소형화도 가능해 어디든 잘 활용될 수 있어요. 그리고 사용하기 쉽게 패키징 되어있어 유저 입장에서는 별다른 노력 없이도 익숙하게 사용할 수 있죠. 

그런데 카메라의 개괄적인 모델만 알고 있어도 사진찍는데도 도움이 될 뿐더러 Computer Vision에서 만나는 여러문제를 이해할 수 있습니다. 가장 간단하고 기본적인 Pinhole camera model을 가지고 차근차근 살펴볼게요.

이후 포스팅에 사용되는 대부분의 그림은 Stanford의 Silvio교수가 강의한 CS231A 클래스의 그림을 사용하도록 하겠습니다.

우선 저희가 어떤 object를 필름 혹은 CCD에 담기 위해서는 어떻게 해야할까요? 

위와 같이 찍으려는 Object에서 반사된 ray를 필름에 모두 담으면 각 픽셀마다 object의 여러부분에서 반사된 ray들이 모두 합쳐져서 이미지를 얻을 수 없게 될 겁니다. 그렇다면 벽을 치고 그 벽에 작은 구멍(조리개, Aperture)만 뚫어서 픽셀당 하나의 ray만 닿을수 있게끔 해볼 수 있겠죠? 그림을 보면 다음과 같이 보일겁니다.
이 것이 가장 간단한 Pinhole camera model입니다. 이렇게 대략적으로 3D object의 한 점과 fixel간에 1:1매칭 관계를 만들 수 있고 그 결과로 필름에 object를 매핑할 수 있습니다. 그럼 Aperture의 크기를 변화시켜 볼까요? 크기를 키우면 들어오는 ray가 많아져 1:1매칭이 되질 않습니다. 그러므로 흐릿한 영상이 얻어지겠죠. 

위의 그림은 aperture를 줄여가면서 찍은 사진들 입니다. 확실히 구멍이 작았을때 더 선명한 사진을 얻을 수 있죠. 그럼 계속해서 줄이면 어떻게 될까요? 아마 빛이 충분히 들어오지 못해 어두운 사진을 얻게 될겁니다. 또한 빛의 회절현상으로 더 흐릿한 사진을 얻게 될 수 도 있을 것 같습니다.

그래서 충분한 빛을 모으기 위한 방법으로 렌즈가 사용됩니다. 볼록렌즈로 빛을 모아서 한점에 맞추면 초점이 잘맞아서 선명하게 보입니다. 그러나 그 외는 초점이 맞질 않아 흐릿하게 보여 사진을 찍을 때 out of focus가 일어납니다.
위 그림에서 보면 Object의 점 P보다 멀거나 가까울 땐 초점이 맞지 않아 그 부분에서 흐릿한 영상을 얻게 됩니다. 그런데 디지털 카메라나 스마트폰의 카메라는 밑의 사진 같이 극단적인 경우가 아니면 자동모드에서 모든 지점에 초점이 잘 맞는것을 볼 수 있습니다. 아마 Multi-AF 기술이거나 aperture를 작게 하고 iso를 높이거나 하드웨어 성능이 높아진 만큼 software로 후처리해 밝게 만드는 방법을 사용하지 않을까 합니다. 


그럼 실제 pinhole 카메라 모델에서 3D object가 2D이미지로 어떻게 매핑 되는지 확인해 볼까요?

위의 이미지만 잘 기억하고 있으면 됩니다. 여기서 $f$는 focal length $O$는 camera center입니다. 그래서 이렇게 3차원 점 $P$를 2차원 점 $P'$에 맵핑하는 것을 Projective transformation이라고도 합니다. $z$는 초점(O)부터 P까지의 거리, $f$는 focal length로써 초점부터 이미지 평면과의 거리로 나타낼 수 있습니다. $z:f=x:x'$와 같은 비례식을 이용한다면, 이 관계는
$$P=\begin{bmatrix} x\\ y\\ z \end{bmatrix} \rightarrow P'=\begin{bmatrix}x'\\y' \end{bmatrix}$$
$$x'=f\frac{x}{z},\,  y'=f\frac{y}{z}$$
그런데 이미지 픽셀은 왼쪽 아래꼭지점을 Origin으로 보고 좌표를 계산하기 때문에 결과로써 center값을 더해주어야하죠. 그럼 다시 매핑 관계를 표현하면
$$(x,\,y,\,z) \rightarrow (f\frac{x}{z}+c_x,\, f\frac{y}{z}+c_y)$$
또한 한가지 더 고려해야할 점은 보통 가로 세로 같은 수의 fixel이 있거나 가로 세로 같은 크기의 fixel들로 구성되어 있지 않습니다. 그래서 meter to fixel 표현에서 고려해야하죠.
$$(x,\,y,\,z) \rightarrow (fk\frac{x}{z}+c_x,\, fl\frac{y}{z}+c_y)$$
$k,l$ : pixel/m 이고 $f$: meter입니다. 그러므로 $fk$을 $\alpha$, $fl$을 $\beta$로 간단히 하면 최종적으로
$$(x,\,y,\,z) \rightarrow (\alpha \frac{x}{z}+c_x,\, \beta \frac{y}{z}+c_y)$$
로 나타낼 수 있습니다. 이 $\alpha, \beta$를 구하는것이 intrinsic calibration으로 미리 알고있는 가로세로길이의 체커보드로 구할 수 있는 파라미터입니다.