Processing math: 100%

2013년 10월 26일 토요일

Direct Linear Transformation

DLT를 이용하여 공간에서 평면을 또 다른 평면으로 변환 시키는 파라메터를 구해보자.
어떤 선형변환 문제가 있다고 하자:  

x=Ay

여기서 x, y는 known vector이고 A 행렬은 unknown이다.  (사실 이 식에는 스케일 불확실성이 들어가 있다.  엄밀하게는 x \sim Ay이다(xAy에 비례, 여기서 ~는 비례관계). 상수를 추가하여 비례를 없애면 ax = Ay이다. a는 스케일 상수이다.

DLT는 xy 벡터가 주어질 때, 행렬 A를 구하는 방법이다. 
이런 모양은 projective geometry에서 많이 나타난다.  Homography^{(*)}

{x'}=Hx

가 그런 예이다. 


DLT 풀이를 위해 양 변을 곱한다. 

(x) \times (Ay) = 0 

이고 이 식은 같은 벡터  2개를 cross product하면 0이 되므로

(x) \times (Ay) = (x) \times (x) = 0

관계식에서 나왔다. 


이 식을 조작하여 

Bh=0

으로 만든다. 구하려는 미지수 행렬 A 요소는 h 벡터로 들어 간다.
h는 새로 형성된 행렬 B의 특이값 분해(SVD: Singular Value Decomposition)로 구한다. 


(*) Homography: 평면상에 있는 점을 또 다른 평면 위 좌표로 바꾸어 준다. 이 변환은 사영 아래에서 plane-to-plane 변환이다. x', x는 homogeneous (3 \times 1) 벡터이고 Homography 행렬 H는 (3 \times 3)의 평면 변환 행렬이다. 사영(perspective) 변환이므로 평면의 투사 변환이다. 


(Ex.) 
DLT를 이용하여 x'=Hx에서 H를 계산해 보자.  여기서, 대응 점 x, x' 정보는 알고 있다. 

x'=(u,v,w)'이고,  H=[h1'; h2'; h3']이다. 

따라서, 

H \cdot x = [h1'x; h2'x; h3'x]

이다. 

H를 구하기 위해 DLT를 적용하면 

(x') \times (H \cdot x)=0

이다.   


(x') \times H \cdot x = [vh3'x-wh2'x;   wh1'x-uh3'x;   uh2'x-vh1'x]

이고, H를 분리하면

[0'\  {-wx'}\   vx'; wx'\   0'\  {-ux'}; {-vx'}\  ux'\ 0'] \cdot [h1; h2; h3] = Ah = 0

이다. A 행렬은 (3 \times 9)이고, h 행렬은 (9 \times 1)이다. 
그런데 A 행렬의 세번째 행은 1과 2행의 조합으로 만들 수 있다:

u \times A1+v \times A2=A3

따라서 A 행렬 세개의 행 중에서 두 개만 선형 독립이고 다음과 같다:

[0'\  {-wx'}\   vx';   {wx'}\   0'\  {-ux'}] \cdot [h1; h2; h3] = 0


이 식을 보면 xx'인 하나의 대응쌍에서 H에 대한 2개의 수식(constraints: 제한 조건)이 나온다. 

(3 \times 3) 크기인 H 행렬에는 9개 요소가 있다. 하지만 스케일 불확실성(즉, H행렬에 임의 상수를 곱해도 모두 같은 H가 될 수 있다)이 있다. 

때문에 마지막 요소 1개를 고정시키면(예를 들면, 마지막 값으로 나머지 8개를 나누면 

H=[h11\ h12\ h13;\ h21\ h22\ h23;\ h31\ h32\ 1]

이다) 8개의 요소가 남아 8 자유도가 된다. 


따라서 서로 대응되는 4개의 점이 있다면 8개의 미지수 모두를 결정할 수 있다. 
대응 점 수가 아주 많다면 위 제한 조건식을 행 방향으로 쌓으면 된다.  

A= [0'       -w1x1'    v1x1'; 
     w1x1'     0'       -u1x1'; 
    ------------------------------
       0'       -w2x2'    v2x2'; 
      w2x1'     0'       -u2x2';
     ------------------------------
           ......
            ......                        ]

n개의 대응 점이 있다면 A행렬의 크기는 (2n \times 9)이다. 
Ah = 0의 풀이는 A를 SVD하여 얻어진 V행렬의 마지막 열을 h로 취한다.    

[U, D, V] = svd(A)
h = V . (0 0 0...1)'








댓글 1개: