DLT를 이용하여 공간에서 평면을 또 다른 평면으로 변환 시키는 파라메터를 구해보자.
어떤 선형변환 문제가 있다고 하자:
어떤 선형변환 문제가 있다고 하자:
x=Ay
여기서 x, y는 known vector이고 A 행렬은 unknown이다. (사실 이 식에는 스케일 불확실성이 들어가 있다. 엄밀하게는 x \sim Ay이다(x는 Ay에 비례, 여기서 ~는 비례관계). 상수를 추가하여 비례를 없애면 ax = Ay이다. a는 스케일 상수이다.
DLT는 x와 y 벡터가 주어질 때, 행렬 A를 구하는 방법이다.
이런 모양은 projective geometry에서 많이 나타난다. Homography^{(*)}
{x'}=Hx
가 그런 예이다.
{x'}=Hx
가 그런 예이다.
DLT 풀이를 위해 양 변을 곱한다.
(x) \times (Ay) = 0
이고 이 식은 같은 벡터 2개를 cross product하면 0이 되므로
(x) \times (Ay) = (x) \times (x) = 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
이 식을 보면 x와 x'인 하나의 대응쌍에서 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)'
이해에 도움되었습니다. 감사합니다.
답글삭제