검색결과 리스트
글
3D 좌표계 변환 방법 (예: 월드좌표계 - 카메라 좌표계)
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 다크 프로그래머
'영상처리' 카테고리의 다른 글
Ferns를 이용한 영상 Object Detection (61) | 2013.08.08 |
---|---|
[영상 Geometry #7] Epipolar Geometry (186) | 2013.07.24 |
[영상 Geometry #6] 이미지 투영(Imaging Geometry) (92) | 2013.07.22 |