2013년 11월 7일 목요일

Camera calibration의 이해

camera parameter들을 더 잘 이해 하기 위해 simple calibration을 수행해 보기로 한다.

먼저 가로와 세로의 길이가 알려져 있는 평평한 물체(예를 들면 책)를 카메라 앞에 두고 사진을 찍는다.
사진을 찍을 때, 책의 모서리가 영상에 수평과 수직으로 나타나게 하고, 기울어 지지 않도록 한다.  책의 중심이 카메라의 광 축을 지나가도록 한다.
또한 카메라와 책 사이의 거리를 미리 측정해 둔다.

                                                           (images from hhkim)

예를 들면 아래 이미지에서 책의 가로 길이는 100mm, 높이는 130mm, 카메라까지의 거리는 500mm이다.

dX=130, dY=100, dZ=500

                                                                   (images from hhkim)

이미지에서 책의 크기를 픽셀 단위로 측정하면 dx=494 pixel, dy=363 pixel이다.
3차원 공간에 있는 한 점이 이미지 면에 맺히는 사영(projection)을 나타내는 식은

x=fx(X/Z),
y=fy(Y/Z)

이다.  여기서 (X, Y, Z)'는 공간 점의 좌표이다. (x, y)'는 이미지 좌표이다.  이 식을 다시 쓰면,

fx = (dx/dX).dZ,
fy = (dy/dY).dZ

이다.  위 이미지의 측정 값들을 대입하면,

fx = (494/130).500 = 1900,
fy = (363/100).500 = 1819

이다.
그런데,  이미지 좌표와 카메라 좌표사이의 관계인 x=fx(X/Z), y=fy(Y/Z)는 동차 좌표(homogeneous coordinate)로 (fx.X, fy.Y, Z)'이고 이 식은 행렬 식으로 다음과 같다.

(fx.X fy.Y Z)'=[fx 0 0 0; 0 fy 0 0; 0 0 1 0].(X Y Z 1)'

만일 이미지 좌표의 원점이 영상 중심이 아니라 (left,top)위치라면 중심까지의 offset 거리를 고려해 주어야 한다.

즉, 공간 좌표 (X Y Z)'는 이미지 좌표 (fX/Z+px, fY/Z+py)로 사영된다. (px, py)'는 이미지 중심 위치이다.
이미지 좌표를 행렬 식으로 나타내면

(fx.X+Z.px, fy.Y+Z.py, Z)'=[fx 0 px 0; 0 fy py 0; 0 0 1 0].(X Y Z 1)'

이다.
이 식을 다시 쓰면

x = K[I | 0]Xcam

이다.  여기서 x는 동차좌표로 표현된 이미지 좌표, K=[fx 0 py; 0 fy py; 0 0 1]인 calibration 행렬이고, I는 3x3의 단위 행렬, 0은 3x1의 0벡터, Xcam은 카메라 축 기준에서 공간 점의 좌표이다.


위의 테스트 이미지에서 해상도는 2592(가로)x1936(높이)이다.  따라서 이미지 센터 위치인 px, py를 이미지 중심이라 하면,

px = 1936/2 = 968,
py = 2592/2 = 1296

이다. 따라서,

K = [1900 0 968; 0 1819 1296; 0 0 1]

이다.




(예 1) 카메라 축의 원점을 기준으로 했을 때, 책 중심 위치의 좌표는 (0 0 500)'이다.  이 점의 이미지 위치를 구하시오.

[s.x, s.y, s]'= K.[I | 0].(0 0 500 1)'

이다.
값을 대입하고 계산하면

(s.x, s.y, s)' = [1900 0 968 0; 0 1819 1296 0; 0 0 1 0].(0 0 500 1)'
           = (968x500, 1296x500, 500)'

이다. 동차 좌표이므로 마지막 항으로 나누어 주면

(x, y, 1)'=(968, 1296, 1)'

이다.  즉, 물체의 중심 점의 이미지 좌표는 px, py와 같아진다.



(예 2) 이미지 좌표 (0, 0)은 공간 위치가 어디인지 계산하시오.

(0, 0, 1)' = K. [I | 0].(X, Y, 500, 1)'

이다.  K 행렬을 알고 있으므로 양변에 inv(K)를 곱해 정규화 좌표(inv(K).x)를 만든다.

inv(K).(0 0 1)' = [1 0 0 0; 0 1 0 0; 0 0 1 0].(X, Y, 500, 1)' = (X, Y, 500)'

이다.

inv(K).(0 0 1)' = (-0.5095, -0.7125, 1)' = (X/500, Y/500, 1)'

이므로, X=-254.75, Y=-356.25이다.
Z=500이므로,

(X, Y, Z)' = (-256.75, -356.25, 500)'

이다.
물론 이 위치는 카메라 축을 원점으로 했을 때의 좌표이다.


















댓글 없음:

댓글 쓰기