[영상 Geometry #5] 3D 변환

영상처리 2013. 7. 15. 10:12

(3D 비전 geometry 4번째 파트 3D 변환입니다)



4. 3D 변환 (3D Transformations)


컴퓨터 비전에서 관심있는 3D 변환은 회전과 평행이동 뿐입니다 (즉, rigid 변환). 하늘에 떠 있는 비행기가 갑자기 커지거나 로보트로 변신하는 것 등은 관심사항이 아닙니다.



4.1 변환 행렬


3차원 공간의 점 (X, Y, Z)를 X축, Y축, Z축을 중심으로 θ 라디안(radian) 회전시키는 행렬을 각각 Rx(θ), Ry(θ), Rz(θ)라 하면 이들은 다음과 같다.


 --- (1)


 --- (2)


 --- (3)


이 때, 회전방향은 아래 그림과 같이 각 축에 대해 반시계 방향이다 (오른손 주먹을 말아쥐고 엄지를 들었을 때 엄지 방향이 회전축 방향, 말아쥔 손가락 방향이 회전방향).



이제 위 3개의 기본 회전변환을 조합하면 임의의 3D 회전을 표현할 수 있다.


 --- (4)


좌표축이 아닌 임의의 단위벡터 u = (ux, uy, uz)을 회전축으로 한 회전변환 행렬은 다음과 같다 (단, ux2 + uy2 + uz2 = 1) (출처: 위키피디아)


--- (5)


회전변환 R, 평행이동 t = [tx, ty, tz]T를 이용한 일반적인 3D 변환식(rigid 변환)은 다음과 같다.


 --- (6)


2D 변환과 마찬가지로, 3D 변환에서도 homogeneous 좌표를 사용하면 다음과 같이 회전변환과 평행이동을 하나의 변환행렬로 즉, 선형변환 형태로 표현할 수 있다.


 --- (7)


참고로, 위키피디아에 보면 어떤 행렬 R이 회전변환이 되기 위한 필요충분 조건은 RT = R-1, det(R) = 1 이라 한다.


4.2 변환관계 구하기


예를 들어 3D 공간에서 비행기 한대가 마음대로 이동한다고 했을 때, 비행기 동선의 임의의 두 지점 사이의 변환관계를 구하는 것이 목적입니다. 물론 이 변환관계는 회전변환과 평행이동만으로 표현이 가능합니다. 먼저 두 벡터 사이의 회전변환을 구하는 문제부터 시작해서 평행이동을 포함한 변환까지 구해보도록 하겠습니다.


4.2.1 회전변환 구하기


크기가 같은 임의의 두 벡터 u = [x, y, z]T, u' = [x', y', z']T가 있을 때, uu'로 이동시키는 회전변환은 다음과 같이 구할 수 있습니다.


 --- (8)


--- (9)


 --- (10)


 --- (11)


θ는 두 벡터 u, u' 사이의 사잇각이며 벡터의 내적을 이용하면 손쉽게 구할 수 있습니다. 회전축이 문제인데, 회전축은 두 벡터 u, u'에 의해 결정되는 평면에 수직인 벡터 즉, 벡터의 외적을 이용하면 됩니다. 이렇게 구한 회전각 θ와 회전축 단위벡터 v를 앞서 식 (5)에 대입하면 원하는 회전변환 행렬을 구할 수 있습니다.


☞ 벡터의 개념 및 백터의 내적, 외적은 알아두면 여러모로 유용합니다. 참고로, 벡터의 외적은 http://blog.naver.com/mindo1103/90103361104 글을 참조하면 잘 설명되어 있습니다. 앞 글에서도 설명했지만 벡터의 외적 u1 × u2 란 두 벡터 u1, u2에 의해 결정되는 평면에 수직이면서(오른손 방향) 그 크기가 u1, u2를 두 변으로 하는 평행사변형의 면적과 같은 벡터를 말합니다


4.2.2 Rigid 변환 구하기


이제 회전뿐만 아니라 평행이동까지 포함한 문제로 확대해 보겠습니다.


3차원 공간에서 어떤 물체의 위치 및 방향을 유일하게 결정하기 위해서는 최소 몇 개의 점이 필요할까요?


물체 위의 3개의 점만 있으면 됩니다. 또한 마찬가지로 3차원 공간에서 움직이는 물체의 위치관계를 표현하기 위해서는 3개의 매칭쌍만 있으면 됩니다.


즉, 3D에서 rigid 변환을 결정하기 위해 필요한 매칭쌍의 개수는 3개입니다.


위 비행기 그림을 예로 들어 rigid 변환을 구하는 과정을 설명하겠습니다.


위치 A에서의 비행기 상의 임의의 점을 (x, y, z), 위치 A'에서의 대응되는 점을 (x', y', z')라 할 때, 주어진 3개의 매칭쌍 p1-p1', p2-p2', p3-p3'를 이용하여 (x, y, z)에서 (x', y', z')로의 rigid 변환관계를 구하는 것이 목적입니다 (pi = (xi,yi,zi), pj'=(xj',yj',zj')).


과정을 간략히 말로 설명하면 1) p1이 원점이 되도록 A를 평행이동 시킨 후, 2) A'의 방향과 일치되도록 회전시켜서, 3) p1'까지 평행이동시킨다 입니다.


결국 관건은 회전변환인데, 두 물체를 일치시키기 위해서는 총 2번의 회전이 필요합니다. 먼저 벡터 p1p2가 벡터 p1'p2'가 되도록 회전시킨 후 (R1), p3와 p3'이 일치되도록 한번 더 회전을 시킵니다 (R2).


 --- (12)


R1은 4.2.1 회전변환 구하기 방법을 사용하면 구할 수 있습니다.


그런데 문제는 R2를 구하는 것인데, 이걸 구하는 게 쉽지가 않네요.. 이리 저리 궁리를 해 봤지만 간결한 방법은 발견하지 못했습니다. 제가 푼 방법을 간략히 설명하면 다음과 같습니다.


먼저 R1까지 적용하면 벡터 R1*p1p2와 벡터 p1'p2'가 일치됩니다. 다음으로 벡터 R1*p1p3를 회전시켜서 p1'p3'이 되도록 만들어야 합니다. 회전축은 R1*p1p2인데 회전각이 문제입니다. 벡터 R1*p1p3와 벡터 p1'p3' 사잇각을 구하는 것은 바람직하지 않습니다. 두 벡터를 R1*p1p2에 수직인 평면에 projection 시킨 후 사잇각을 구해야 합니다. projection을 직접 구하는 것은 어렵기 때문에 R1*p1p2 & R1*p1p3에 의해 결정되는 평면에 수직인 벡터(법선벡터)와 R1*p1p2 & p1'p3'에 의해 결정되는 평면에 수직인 법선벡터를 구해서 두 법선벡터가 일치되도록 회전을 시키면 됩니다. 즉, R2는 (R1*p1p2)×(R1*p1p3)를 (R1*p1p2)×p1'p3'로 회전시키는 행렬입니다.


☞ 이상으로 3D 공간에서 물체의 임의의 변환관계를 3개의 매칭쌍을 이용하여 계산하는 방법을 살펴보았습니다. 그런데 여기서 설명한 방법은 나름 구해본 방법이기 때문에 더 좋은 방법이 있을 거라 생각합니다 (지금은 모르지만). 특히 여기서 설명한 방법은 매칭쌍이 3개인 경우에만 적용가능하며 매칭쌍이 3개 이상인 경우까지는 확장이 안됩니다. 즉, 다수의 (3개 이상) 매칭쌍에 대해 이들을 가장 잘 근사하는 변환을 구할 때에는 다른 방법이 필요할 것입니다.



4.3 좌표축 변환


마지막으로 3D 공간에서 좌표축 변환 행렬을 살펴보고 글을 마무리하겠습니다.


[영상처리] - [컴퓨터 비전에서의 Geometry #1] 좌표계 에서 설명했던 월드 좌표계와 카메라 좌표계 사이의 변환이 좌표축 변환에 해당합니다.


월드좌표계 상에서 카메라 초점(카메라 좌표계의 원점)의 좌표를 (Fx, Fy, Fz), 월드좌표계의 좌표축을 카메라 좌표계 좌표축으로 회전시키는 행렬을 R이라 하겠습니다.


이 때, 월드 좌표계의 점 (X, Y, Z)을 카메라 좌표계로 봤을 때의 좌표 (Xc, Yc, Zc)는 다음과 같이 구해집니다.


 --- (13)


회전변환 행렬의 경우 RTR = I 즉, R-1 = RT가 성립하므로 위 식은 아래와 같이 쓸 수 있습니다.


 --- (14)


카메라 좌표계 상의 점을 월드 좌표계로 바꿀 때에도 위 식을 역으로 이용하면 됩니다.


실제로 R을 구하는 방법에 대해서는 [영상처리] - 3D 좌표계 변환 방법 (예: 월드좌표계 - 카메라 좌표계) 글을 참조하기 바랍니다.



by 다크 프로그래머