3D 좌표계 변환 방법 (예: 월드좌표계 - 카메라 좌표계)

영상처리 2013. 7. 25. 14:02

3차원 공간에서 좌표축 또는 좌표계를 변환하는 방법입니다.

 

3D 월드 좌표계를 카메라 좌표계로 변환하는 것을 예로 들어 설명하겠습니다.

 

즉, 월드 좌표계(world coordinate system)에서의 점 (X, Y, Z)로부터 카메라 좌표계에서 봤을 때의 좌표 (Xc, Yc, Zc)를 구하는게 목적입니다.

 

<그림 1>

 

<그림 1>과 같이 월드좌표계와 카메라 좌표계를 정의하겠습니다.

  • 월드 좌표계: 지면이 XY 평면, 위쪽이 Z축
  • 카메라 좌표계: 카메라 광학축 방향이 Zc, 오른쪽이 Xc, 아래쪽이 Yc

 

또한 월드 좌표계 내에서 카메라의 위치 및 방향을 다음과 같이 정의하겠습니다.

  • 카메라의 위치: 월드 좌표계 내에서 카메라 좌표축 원점의 위치, (X1, Y1, Z1)
  • pan(팬): 카메라의 좌우 회전각. 광학축이 월드좌표계 Y축과 평행할때 0도, 왼쪽이 +, 오른쪽이 -
  • tilt(틸트): 카메라의 상하 회전각. 광학축이 월드좌표계 XY평면과 평행할때 0도, 위쪽이 +, 아래쪽이 -
  • roll(롤):  카메라 광학축을 기준으로 한 회전각으로서, 카메라와 같은 방향을 바라볼 때 반시계 방향이 + 방향

 

즉, 카메라의 pan, tilt는 카메라 광학축(Zc)이 Y축 방향일 때 0이고 카메라를 위로 들면 tilt가 증가, 왼쪽으로 돌리면 pan이 증가합니다.

 

이제 풀고자 하는 문제를 정리하면 다음과 같습니다.

카메라의 위치를 (X1, Y1, Z1), 카메라의 팬(pan) 각을 p 라디안, 틸트(tilt)를 t 라디안이라 할 때, 월드좌표계 상의 임의의 점 (X, Y, Z)를 카메라 좌표계 상의 좌표 (Xc, Yc, Zc)로 변환시키는 관계식을 구하라.

 

좌표계 변환관계는 2가지 방법으로 구할 수 있습니다. 하나는 일련의 회전변환 행렬을 조합하는 것이고, 다른 한 방법은 단위벡터를 이용해 직접 변환행렬을 구하는 방법입니다.

 

 

방법 1: 회전변환을 조합하는 방법

 

월드 좌표축을 카메라 좌표축 방향과 일치되도록 하는 회전변환 행렬을 R이라 하면, R은

 

 --- (1)

 

과 같이 구해집니다 (3D 회전변환 행렬에 대해서는 [컴퓨터 비전에서의 Geometry #5] 3D 변환 참조)

 

☞ Roll까지 고려한 경우, R = Rz(p)Rx(t)Ry(-roll)Rx(-π/2)로 구해진다.

 

따라서, 월드좌표를 카메라 좌표로 변환시키는 변환식은 다음과 같이 구해집니다.

 

 --- (2)

 

좌표축 변환은 일반적인 변환과정을 역으로 적용함에 주의해야 합니다.

 

식 (2)에서 회전변환은 RRT = I를 만족하기 때문에 R-1 = RT로 구할 수 있습니다. 즉, 식 (2)는 다음과 같이 됩니다.

 

 --- (3)

 

☞ 여기서 R은 월드좌표를 카메라좌표로 변환시키는 행렬이 아니라 좌표축을 변환시키는 행렬임에 주의해야 합니다. 즉, R은 월드좌표축->카메라좌표축 변환 행렬입니다. 즉, 좌표로 보면 R은 카메라좌표->월드좌표로 변환시키는 행렬입니다 (좌표축 변환과 좌표변환은 서로 역변환 관계). 이 글에서 정의한 R과 opencv의 solvePnP에서 반환되는 R이 표기가 같아서 서로 혼동스러울 수 있겠지만 solvePnP에서 반환되는 R은 월드좌표->카메라좌표 변환행렬이고, 여기서 정의한 R은 카메라좌표->월드좌표 변환행렬입니다. 즉, 서로 반대입니다. 표기를 통일하는게 좋았겠지만 이 글에서는 설명의 흐름상 어쩔 수 없이 R을 다른 글들과는 다르게(반대로) 정의했습니다..

 

방법 2: 변환행렬을 직접 구하는 방법

 

어떤 선형변환 행렬 T가 있을 때, 각각의 좌표축 단위벡터들이 변환 T에 의해서 어디로 가는지만 알면 T를 손쉽게 구할 수 있습니다.

 

만일, T에 의해 X축 단위벡터 (1, 0, 0)이 (a1,a2,a3)로 가고, Y축 단위벡터 (0, 1, 0)이 (b1, b2, b3), Z축 단위벡터 (0, 0, 1)이 (c1, c2, c3)가 된다면, 변환행렬 T는 다음과 같습니다.

 

 --- (4)

 

이제, 이 방법를 이용하여 X축을 Xc, Y축을 Yc, Z축을 Zc로 보내는 변환행렬 R을 구해보겠습니다.

 

<그림 2>

 

<그림 2>를 참조하여 각각의 단위벡터가 어디로 이동해야 하는지를 구해보면 다음과 같습니다.

 

 --- (5)

 

따라서, 변환행렬 R은 다음과 같이 구해집니다.

 

 --- (6)

 

식 (1)과 동일한 결과가 나옴을 확인할 수 있습니다.

 

나머지 과정은 방법 1과 마찬가지이기에 생략합니다 (최종적으로는 식 (3)과 동일한 변환식이 나옵니다).

 

☞ 식 (3)은 벽에 고정된 CCTV, 자동차에 고정된 카메라 등에서 좌표계 변환을 할 때 유용하게 활용될 수 있으리라 생각합니다.

 

by 다크 프로그래머