포스트

다중 시점 기하를 읽기 위한 최소한의 수학 — 동차좌표·랭크·자유도·SVD

다중 시점 기하를 읽기 위한 최소한의 수학 — 동차좌표·랭크·자유도·SVD

서론

다중 시점 기하 글들을 쓰면서 설명 없이 지나간 말들이 있습니다. “동차 좌표로 쓰면”, “랭크 2로 강제한다”, “자유도가 7이다”, “SVD의 최소 특이벡터를 취한다” 같은 것들입니다.

그런데 이 네 가지는 사실상 같은 이야기의 네 얼굴입니다.

카메라는 3차원을 2차원으로 눌러 버리고, 그 과정에서 스케일 하나를 잃는다. 그래서 이 분야의 모든 방정식은 “등호“가 아니라 “스케일 빼고 등호“로 쓰이고, 모든 해는 “정확한 해“가 아니라 “가장 덜 틀린 방향“으로 구해진다.

동차 좌표는 그 손실을 표기법으로 인정하는 방법이고, 랭크와 자유도는 남은 정보가 얼마인지 세는 방법이며, SVD는 그 남은 정보에서 답을 뽑아내는 도구입니다.

에피폴라 기하삼각측량·번들 조정을 읽다 막혔다면, 이 글이 그 밑에 깔린 층입니다.


1. 동차 좌표계 — 좌표 하나를 더 붙이는 이유

투영은 나눗셈이다

핀홀 카메라가 3차원 점 $(X, Y, Z)$를 이미지에 찍는 식은 이렇습니다.

\[u = f\frac{X}{Z}, \qquad v = f\frac{Y}{Z}\]

나눗셈이 있습니다. 이게 문제입니다. 나눗셈이 끼면 이 연산은 선형이 아니고, 선형이 아니면 행렬 곱으로 쓸 수 없고, 행렬 곱으로 못 쓰면 여러 변환을 하나로 합칠 수도, 선형대수 도구를 갖다 쓸 수도 없습니다.

해법은 놀랍도록 단순합니다. 나눗셈을 미루는 것입니다. 좌표를 하나 더 붙여서 $(u, v)$ 대신 $(u, v, w)$로 들고 다니되, “진짜 좌표는 $w$로 나눈 값”이라고 약속합니다.

\[(x,\, y,\, w) \;\longmapsto\; \left(\frac{x}{w},\; \frac{y}{w}\right)\]

이것이 동차 좌표(homogeneous coordinates) 입니다. 나눗셈은 마지막에 한 번만 하고, 그 전까지는 전부 행렬 곱으로 처리합니다.

스케일이 같으면 같은 점이다

당연한 따름 결과가 하나 있습니다. $(x, y, w)$와 $(2x, 2y, 2w)$는 나누면 같은 값이 나오므로 같은 점입니다. 0이 아닌 어떤 $k$에 대해서도 그렇습니다.

\[(x,\, y,\, w) \;\sim\; (kx,\, ky,\, kw), \qquad k \neq 0\]

즉 동차 좌표에서 “한 점”은 벡터 하나가 아니라 원점을 지나는 직선 하나입니다. 이 직선 위 어느 점을 집어도 같은 이미지 좌표를 줍니다.

동차 좌표의 기하학적 의미 동차 좌표에서 한 점은 원점을 지나는 광선 전체다. 그 광선이 $w = 1$ 평면을 뚫는 자리가 우리가 보는 좌표다. 광선이 평면과 평행하면($w = 0$) 평면을 영원히 만나지 않는데, 이것이 무한원점이다.

앞선 글들에서 등호 대신 $\simeq$ 를 쓴 이유가 이것입니다. $x \simeq PX$ 는 “$x$와 $PX$가 같은 광선 위에 있다”는 뜻이지, 성분이 하나하나 같다는 뜻이 아닙니다.

이 스케일 자유도가 나중에 자유도를 셀 때마다 1씩 빠지는 그 $-1$의 정체입니다.

무한원점 — $w = 0$ 은 오류가 아니다

$w = 0$이면 나눌 수 없습니다. 예외 처리해야 할 버그처럼 보이지만, 사실은 이 표기법이 주는 입니다.

$w$를 0으로 보내 보면 $(x/w,\, y/w)$는 $(x, y)$ 방향으로 무한히 멀어집니다. 그래서 $(x, y, 0)$은 “그 방향의 무한히 먼 점”, 즉 무한원점(point at infinity) 으로 읽습니다. 이것은 순수한 추상이 아닙니다.

철길 사진에서 두 레일이 만나는 그 점 — 소실점(vanishing point) 이 바로 무한원점의 상입니다.

소실점은 개념 설명에만 쓰이는 것이 아니라 카메라의 자세를 알아내는 실전 도구이기도 합니다. 그 활용은 다크프로그래머의 영상 소실점(vanishing point)의 이해와 활용에 정리돼 있습니다.

유클리드 평면에서 평행선은 만나지 않지만, 무한원점을 포함한 사영 평면에서는 모든 직선 쌍이 예외 없이 한 점에서 만납니다. “평행한 경우”라는 예외 처리가 통째로 사라집니다.1

점과 직선이 대칭이 된다

동차 좌표의 두 번째 선물은 쌍대성(duality) 입니다. 직선 $au + bv + c = 0$ 을 벡터 $l = (a, b, c)^\top$ 로 쓰면, 점 $x$가 직선 $l$ 위에 있다는 조건이 내적 하나가 됩니다.

\[x^\top l = 0\]

점과 직선이 똑같이 3차원 벡터이고, 관계식은 대칭입니다. 그래서 이런 일이 가능해집니다.

하고 싶은 일계산
두 점 $x_1$, $x_2$ 를 지나는 직선$l = x_1 \times x_2$
두 직선 $l_1$, $l_2$ 의 교점$x = l_1 \times l_2$

외적 한 번이면 끝입니다. 평행한 두 직선을 넣으면? 오류가 나지 않고 $w = 0$인 무한원점이 나옵니다.

에피폴라 기하의 $l’ = Fx$ 도 이제 제대로 읽힙니다. 점을 넣으면 직선이 나오는 $3 \times 3$ 행렬 — 점과 직선이 같은 모양의 벡터이기 때문에 성립하는 문장입니다.


동차 좌표를 한국어로 더 찬찬히 보고 싶다면 다크프로그래머의 영상 Geometry #2 — Homogeneous Coordinates를, 아래 투영 행렬 이야기는 같은 시리즈의 영상 Geometry #6 — 이미지 투영을 함께 읽으면 좋습니다.


2. 핀홀 카메라 — $P = K[R \mid t]$ 뜯어보기

이제 투영 행렬을 세 단계로 나눠 읽을 수 있습니다.

\[x \simeq K\,[\,R \mid t\,]\, X\]

① $[R \mid t]$ — 세계 좌표계에서 카메라 좌표계로. 카메라가 세상 어디에 어떤 자세로 있는지입니다. 회전 $R$ 이 3자유도(예: 롤·피치·요), 이동 $t$ 가 3자유도. 합쳐서 외부 파라미터(extrinsic) 6자유도입니다.

② 투영 — 3차원을 2차원으로. 카메라 좌표 $(X_c, Y_c, Z_c)$ 를 $(X_c/Z_c,\, Y_c/Z_c)$ 로 보냅니다. 동차 좌표 덕분에 이 단계는 “그냥 $Z_c$ 를 $w$ 자리에 둔다”로 끝나고, 여기서 깊이가 사라집니다. 결과를 정규화 좌표(normalized coordinate) 라고 부릅니다 — 초점거리 1, 주점 원점인 가상의 카메라가 본 좌표입니다.

③ $K$ — 정규화 좌표에서 픽셀로. 실제 센서의 사정을 반영합니다.

\[K = \begin{bmatrix} f_x & s & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}\]
  • $f_x$, $f_y$ — 픽셀 단위 초점거리. 픽셀이 정사각형이 아니면 둘이 다릅니다.
  • $c_x$, $c_y$ — 주점(principal point). 광축이 센서를 뚫는 자리로, 보통 이미지 중심 근처지만 정확히 중심은 아닙니다.
  • $s$ — 스큐. 현대 센서에서는 사실상 0입니다.

이 다섯 개가 내부 파라미터(intrinsic) 이고, 이것을 미리 알아내는 작업이 캘리브레이션입니다.

여기서 앞선 글의 두 문장이 정리됩니다.

  • $K$를 알면 픽셀을 $K^{-1}$ 로 되돌려 정규화 좌표로 갈 수 있고, 그래서 $F$ 대신 더 강한 구조를 가진 $E$ 를 쓸 수 있습니다.
  • $K$를 모르면 픽셀 좌표에서 직접 할 수 있는 것만 해야 하고, 그게 $F$ 입니다.

전체를 합친 $P = K[R \mid t]$ 는 $3 \times 4$ 행렬이니 원소가 12개, 스케일이 무의미하므로 자유도 11입니다. 내부 5 + 외부 6 = 11 로 정확히 맞습니다.


3. 랭크 — 행렬이 실제로 쓰는 차원의 수

행렬 $A$ 의 랭크는 독립인 열의 개수, 다르게 말하면 $A$ 를 곱했을 때 결과가 놓이는 공간의 차원입니다. $3 \times 3$ 행렬의 랭크가 3이면 3차원을 3차원으로 온전히 보내지만, 랭크가 2면 3차원을 2차원 평면으로 눌러 버립니다.

눌러 버린다는 건 뭔가가 0으로 사라진다는 뜻입니다. 랭크가 부족한 만큼 $A v = 0$ 을 만족하는 0이 아닌 벡터 $v$ 가 존재하고, 그런 $v$ 들의 공간을 영공간(null space) 이라고 부릅니다.

\[\operatorname{rank}(A) + \dim(\ker A) = n\]

$3 \times 3$ 행렬이라면 랭크 3 → 영공간은 ${0}$ 뿐, 랭크 2 → 영공간이 직선 하나, 즉 동차 좌표로는 점 하나입니다.

그래서 $F$ 의 랭크가 2라는 말은

이 관점에서 보면 기본 행렬의 성질들이 전부 한 줄로 이어집니다.

\[F e = 0, \qquad F^\top e' = 0\]

$F$ 의 랭크가 2라서 영공간이 정확히 1차원이고, 그 유일한 방향이 바로 에피폴 $e$ 입니다. 기하로 말하면 “모든 에피폴라 선이 한 점에서 만난다”는 사실이고, 대수로 말하면 “$F$ 가 뭔가를 0으로 뭉갠다”는 사실입니다. 같은 말입니다.

반대로 랭크가 3인 $F$ 를 그대로 쓰면 어떻게 될까요? 영공간이 ${0}$ 뿐이니 에피폴이 존재하지 않습니다. 에피폴라 선들이 한 점에서 만나지 않고 조금씩 엇갈립니다. 8점 알고리즘에서 랭크 2를 강제로 되돌려야 하는 이유가 이것입니다.


4. 자유도 — 세는 법과, 그것이 정하는 것

자유도(DoF) 는 그 대상을 특정하는 데 필요한 독립 숫자의 개수입니다. 세는 공식은 단순합니다.

\[\text{자유도} \;=\; \text{원소 수} \;-\; \text{무의미한 스케일} \;-\; \text{제약 수}\]
대상원소빼는 것자유도
회전 $R$9직교 조건 6개3
이동 $t$33
내부 파라미터 $K$90이 강제된 자리 등5
투영 행렬 $P$12스케일 111
호모그래피 $H$9스케일 18
기본 행렬 $F$9스케일 1, $\det F = 0$ 17
필수 행렬 $E$9$R$ 3 + $t$ 3 − 스케일 15

자유도는 취향의 문제가 아니라 몇 개의 대응점이 필요한지를 직접 정합니다. 대응점 한 쌍이 방정식 몇 개를 주는지 세고, 자유도를 채울 만큼 모으면 됩니다.

  • 호모그래피 $H$ — 대응 한 쌍이 방정식 2개(좌표 $u$, $v$). 자유도 8 ÷ 2 = 4점.
  • 기본 행렬 $F$ — $x’^\top F x = 0$ 은 대응 한 쌍당 스칼라 방정식 1개. 자유도 7이니 7점이면 이론상 충분하고, $\det F = 0$ 을 쓰지 않고 선형으로만 풀면 8점이 필요합니다.
  • 필수 행렬 $E$ — 자유도 5, 그래서 5점.

7점 알고리즘이 존재하는데도 8점법이 표준처럼 쓰이는 이유는, 7점법이 $\det F = 0$ 이라는 3차 방정식을 풀어야 해서 해가 최대 3개 나오고 그중 하나를 고르는 과정이 붙기 때문입니다. 반면 8점법은 순수 선형이라 SVD 한 번이면 끝납니다.


5. SVD와 특이값 — 동차 최소제곱의 만능 도구

SVD 자체가 낯설다면 다크프로그래머의 선형대수학 #4 — 특이값 분해(SVD)의 활용이 좋은 출발점입니다. 여기서는 그중 동차 최소제곱을 푸는 도구라는 한 가지 쓰임에 집중합니다.

SVD가 말하는 것

임의의 행렬은 항상 이렇게 분해됩니다.

\[A = U \Sigma V^\top, \qquad \Sigma = \operatorname{diag}(\sigma_1 \geq \sigma_2 \geq \cdots \geq \sigma_r \geq 0)\]

$U$, $V$ 는 직교행렬(회전), $\Sigma$ 는 대각행렬입니다. 읽는 법은 “회전 → 축마다 다른 배율로 늘이기 → 회전” 입니다. 특이값 $\sigma_i$ 가 각 축의 늘이는 배율이고, 0인 특이값은 그 방향이 완전히 뭉개진다는 뜻입니다.

여기서 랭크의 정의가 다시 나옵니다. 0이 아닌 특이값의 개수 = 랭크.

왜 “가장 작은 특이벡터”가 답인가

다중 시점 기하의 방정식은 거의 전부 이 모양입니다.

\[A f = 0, \qquad \|f\| = 1\]

$f = 0$ 은 의미가 없으니 크기를 1로 고정합니다(동차 좌표라 스케일은 어차피 무의미하니 손해도 없습니다). 노이즈가 있으면 정확히 0이 되는 $f$ 는 없으므로, $|Af|$ 를 가장 작게 만드는 $f$ 를 찾습니다.

$V$ 의 열들은 정규직교 기저이니 $f = \sum_i c_i v_i$ 로 쓸 수 있고, 그러면

\[\|A f\|^2 = \sum_i \sigma_i^2 c_i^2, \qquad \sum_i c_i^2 = 1\]

가중치 $\sigma_i^2$ 를 갖는 가중평균을 최소화하는 문제입니다. 답은 뻔합니다 — 가장 작은 $\sigma_i$ 에 전부 몰아주기. 즉 $f = v_n$, $V$ 의 마지막 열입니다.

$A f = 0$ 꼴이 나오면 SVD를 하고 마지막 특이벡터를 취한다. 8점 알고리즘도, 삼각측량의 DLT도, 호모그래피 추정도 전부 이 한 문장입니다.

랭크를 강제하는 것도 SVD

$F$ 를 랭크 2로 되돌리는 일 역시 SVD입니다. 가장 작은 특이값을 0으로 바꿔 다시 조립하면 됩니다.

\[F = U \operatorname{diag}(\sigma_1, \sigma_2, \sigma_3) V^\top \;\longrightarrow\; \hat{F} = U \operatorname{diag}(\sigma_1, \sigma_2, 0) V^\top\]

이것이 임의로 잘라내는 편법이 아니라 최선이라는 보장이 있습니다. Eckart–Young 정리에 따르면, 이렇게 만든 $\hat{F}$ 는 랭크 2인 모든 행렬 중 원래 $F$ 와 프로베니우스 거리가 최소입니다.2

조건수 — 정규화가 중요한 진짜 이유

$\sigma_1 / \sigma_r$ 을 조건수(condition number) 라고 부릅니다. 이 값이 크면 입력의 작은 오차가 답에서 크게 증폭됩니다.3

에피폴라 글에서 “정규화를 빼먹으면 답이 망가진다”고만 하고 넘어갔는데, 실제로 재 보면 이렇습니다. 3차원 점 40개를 두 카메라로 투영하고 0.5픽셀 노이즈를 섞어 $A$ 를 만든 뒤, 픽셀 좌표 그대로일 때와 정규화했을 때의 특이값을 비교한 것입니다.

A와 F의 특이값 분포 왼쪽 — 픽셀 좌표를 그대로 쓰면 특이값이 7자릿수에 걸쳐 흩어지지만, 정규화하면 2자릿수 안으로 모인다. 조건수가 약 2.5만 배 개선된다. 오른쪽 — 추정된 $F$ 의 세 번째 특이값은 노이즈 때문에 0이 아니라 $3.9 \times 10^{-4}$ 다. 이것을 0으로 강제하는 것이 랭크 2 되돌리기다.

왼쪽 그림의 갈색 막대가 흩어진 이유는 단순합니다. $A$ 의 열에는 $u’u \sim 10^5$ 규모의 항과 상수 1이 나란히 들어 있습니다. 열 사이 크기가 $10^5$ 배 차이 나면 SVD는 큰 열의 오차만 신경 쓰게 되고, 작은 열이 담은 정보는 반올림 오차에 묻힙니다. 평균 0, 원점까지 평균 거리 $\sqrt{2}$ 로 맞추는 한 줄이 이 문제를 통째로 없앱니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np

def solve_homogeneous(A):
    """A f = 0, ||f|| = 1 의 최소제곱 해 — V의 마지막 열."""
    return np.linalg.svd(A)[2][-1]

def enforce_rank(M, r):
    """M을 랭크 r인 가장 가까운 행렬로 (Eckart-Young)."""
    U, S, Vt = np.linalg.svd(M)
    S[r:] = 0.0
    return U @ np.diag(S) @ Vt

def condition_number(A):
    s = np.linalg.svd(A, compute_uv=False)
    return s[0] / s[-2]        # 마지막은 '해가 되는 방향'이므로 제외

6. 그래서, 자주 나오는 질문들

여기까지 오면 앞선 글들에서 “퇴화 상황”이라고 뭉뚱그린 것들을 하나씩 따져 볼 수 있습니다.

Q1. 카메라 중심 $C$, $C’$ 를 모르면 $F$ 를 못 구하나?

정반대입니다. $F$ 는 오직 대응점 좌표만으로 구합니다. 카메라가 어디 있는지, 초점거리가 얼마인지 전혀 몰라도 됩니다. 그게 $F$ 의 존재 이유입니다.

오히려 순서가 반대입니다. $F$ 를 먼저 구하면 거기서 카메라 정보가 나옵니다. $Fe = 0$ 의 영벡터가 에피폴 $e$ 이고, 에피폴은 정의상 다른 카메라 중심의 상입니다. 즉 $F$ 는 “$C’$ 가 첫 번째 이미지의 어느 픽셀에 찍히는가”를 이미 알고 있습니다.

다만 거기까지입니다. $C$, $C’$ 의 절대 위치는 $F$ 만으로 절대 알 수 없습니다(Q7 참조).

Q2. $C$ 와 $C’$ 가 같으면 어떻게 되나?

계산이 안 됩니다. 이건 수치적 어려움이 아니라 대상이 존재하지 않는 경우입니다.

에피폴라 평면은 $C$, $C’$, $X$ 세 점으로 정의되는데, $C = C’$ 면 두 점이 같아져 평면이 정해지지 않습니다. 대수로 봐도 마찬가지입니다. $E = [t]_\times R$ 에서 $t = 0$ 이면

\[E = [0]_\times R = 0\]

영행렬입니다. $\hat{x}’^\top E \hat{x} = 0$ 은 모든 대응점에 대해 자동으로 성립하므로 아무 정보도 주지 않습니다. 8점 알고리즘을 돌리면 $A$ 의 작은 특이값이 여러 개 나오면서(랭크 부족) 해가 무한히 많아집니다.

이 상황이 바로 순수 회전입니다. 제자리에서 카메라를 돌리기만 하면 베이스라인이 0이 되죠. 이때 두 이미지를 묶는 올바른 모델은 $F$ 가 아니라 호모그래피 $H = K’ R K^{-1}$ 입니다. 깊이가 식에서 완전히 빠져 있다는 점에 주목할 만합니다 — 순수 회전에서는 아무리 찍어도 3차원을 복원할 수 없습니다.

파노라마 촬영이 정확히 이 경우이고, 그래서 파노라마 스티칭은 $H$ 로 합니다.

Q3. 3차원 점 $X$ 가 베이스라인 위에 놓이면?

$C$, $C’$, $X$ 가 한 직선 위에 있으면 이 셋으로 평면이 하나로 정해지지 않습니다. 베이스라인을 축으로 도는 평면 전부가 조건을 만족하죠.

이때 $X$ 의 상은 어디에 찍힐까요? $C$ 에서 $X$ 로 가는 광선이 곧 베이스라인이므로, $x$ 는 에피폴 $e$ 자기 자신입니다. 마찬가지로 $x’ = e’$. 그리고

\[e'^\top F e = 0\]

은 $Fe = 0$ 이라서 항상 성립합니다. 제약이 만족되긴 하는데, 어떤 $F$ 를 넣어도 만족되므로 정보량이 0입니다. 카메라가 이동하는 방향 정면에 있는 점은 에피폴라 제약으로 검증할 수 없다는 뜻이고, 실제로 전진하는 차량 카메라에서 소실점 근처 특징점의 깊이가 유독 불안정한 이유이기도 합니다.

Q4. 대응점이 정확히 8개여야 하나?

8개는 최소입니다.

  • 8개 초과 — 방정식이 미지수보다 많은 과결정 문제가 되고, SVD가 알아서 최소제곱 해를 줍니다. 실전에서는 수십~수백 쌍을 씁니다. 많을수록 노이즈에 강해집니다.
  • 정확히 7개 — 자유도가 7이니 이론상 가능합니다. 다만 $\det F = 0$ 을 명시적으로 걸어야 해서 3차 방정식이 되고, 실수해가 1개 또는 3개 나옵니다. RANSAC에서는 표본이 적을수록 반복 횟수가 확 줄기 때문에 7점법을 쓰기도 합니다.
  • 7개 미만 — 캘리브레이션을 모르면 불가능합니다. 알고 있다면 $E$ 의 자유도가 5뿐이라 5점법이 가능합니다.

Q5. 노이즈가 있으면 $\sigma_9$ 가 정확히 0이 아닌데, 그래도 되나?

그래서 SVD를 쓰는 것입니다.

노이즈가 전혀 없으면 $A$ 의 랭크가 정확히 8이고 $\sigma_9 = 0$ 이며, 그 방향이 정확한 답입니다. 노이즈가 있으면 $\sigma_9$ 는 작지만 0이 아닌 값이 되고, 이때 마지막 특이벡터는 “$|Af|$ 를 최소로 만드는 방향” — 즉 가장 덜 틀린 답이 됩니다. 위 그림 오른쪽의 $3.9 \times 10^{-4}$ 가 그 값입니다.

중요한 건 $\sigma_9$ 가 얼마나 작은지가 해가 얼마나 믿을 만한지를 알려 준다는 점입니다. $\sigma_8$ 과 $\sigma_9$ 가 비슷하면 두 방향이 거의 대등하게 좋다는 뜻이고, 이는 답이 하나로 정해지지 않는다는 신호입니다. 앞서 말한 퇴화 상황들이 정확히 이렇게 나타납니다.

Q6. 랭크 2를 강제하지 않으면 정말 문제가 되나?

됩니다. 랭크 3인 $F$ 는 가역이므로 $Fe = 0$ 의 해가 $e = 0$ 뿐인데, 동차 좌표에서 영벡터는 점이 아닙니다. 즉 에피폴이 존재하지 않습니다.

결과적으로 에피폴라 선들이 한 점에서 만나지 않고 조금씩 엇갈립니다. 이 $F$ 로 $E$ 를 만들어 $(R, t)$ 로 분해하면 특이값이 $(\sigma, \sigma, 0)$ 구조를 만족하지 않아 분해 자체가 어긋나고, 그 오차가 삼각측량과 번들 조정까지 그대로 전파됩니다.

Q7. $F$ 를 알면 카메라 자세를 알 수 있나?

없습니다. 이게 $F$ 와 $E$ 의 결정적 차이입니다.

$F$ 에서 얻을 수 있는 것은 사영 변환만큼의 모호성을 가진 재구성입니다. 어떤 $4 \times 4$ 가역 행렬 $H$ 에 대해 카메라를 $PH^{-1}$, 점을 $HX$ 로 바꿔도 이미지는 완전히 똑같습니다. 즉 장면이 어떻게 휘어져 있는지 알 수 없습니다 — 직각이 직각인지, 평행이 평행인지조차 모릅니다.

$K$ 를 알아야 이 모호성이 걷히고 $E$ 로 갈 수 있습니다. 그리고 $E$ 를 분해하면 $(R, t)$ 가 나오지만, $t$ 의 크기는 여전히 모릅니다. 남는 모호성이 사영 변환에서 스케일 하나로 줄어드는 것 — 그게 캘리브레이션이 사 주는 것의 전부이자 핵심입니다.

Q8. 스케일을 버리는 게 정보를 잃는 것 아닌가?

카메라가 이미 버린 것을 표기법이 정직하게 인정하는 것뿐입니다.

렌즈 앞에서 3차원 점이 광선 위 어디에 있었는지는 사진에 남지 않습니다. 동차 좌표는 이 사실을 “같은 광선 위 점들은 구별되지 않는다”로 표현합니다. 정보를 버리는 게 아니라, 애초에 없는 정보를 있는 척하지 않는 표기법입니다.

그리고 이 태도가 곧바로 실용적 결론을 냅니다. 단안 카메라 SLAM이 IMU나 스테레오나 기지 크기 물체를 필요로 하는 이유, 즉 스케일 모호성은 이 표기법이 처음부터 정직하게 드러내고 있던 것입니다.


마치며

네 가지 도구를 한 문장씩으로 남깁니다.

  1. 동차 좌표 — 나눗셈을 미뤄 투영을 행렬 곱으로 만든다. 대가로 스케일이 무의미해지고, 덤으로 무한원점과 점–직선 쌍대성을 얻는다.
  2. 핀홀 카메라 — $P = K[R \mid t]$. 내부 5 + 외부 6 = 자유도 11. $K$ 를 아는가가 $F$ 와 $E$ 를 가른다.
  3. 랭크 — 행렬이 뭉개는 방향이 있다는 뜻. $F$ 의 랭크 2가 곧 에피폴의 존재이고, 둘은 같은 사실의 두 표현이다.
  4. SVD — $Af = 0$ 을 만나면 마지막 특이벡터. 랭크를 강제할 때도, 조건수를 볼 때도 같은 도구.

그리고 퇴화 상황들은 전부 하나의 질문으로 환원됩니다. “이 데이터가 답을 하나로 정하기에 충분한가?” 베이스라인이 0이면(Q2), 점이 베이스라인 위에 있으면(Q3), 장면이 평면이면 — 답이 하나로 정해지지 않고, 그 사실은 언제나 작은 특이값이 여러 개 나오는 것으로 드러납니다.

퇴화를 별도의 예외 목록으로 외울 필요가 없다는 뜻입니다. 특이값을 보면 됩니다.


참고문헌

  1. Hartley, R., & Zisserman, A. (2004). Multiple View Geometry in Computer Vision (2nd ed.). Cambridge University Press. — 사영기하와 동차 좌표는 2~3장, 카메라 모델은 6장, 수치 해법과 조건수는 부록 5. ↩︎

  2. Eckart, C., & Young, G. (1936). The approximation of one matrix by another of lower rank. Psychometrika, 1(3), 211–218. ↩︎

  3. Trefethen, L. N., & Bau, D. (1997). Numerical Linear Algebra. SIAM. — SVD와 조건수의 표준 레퍼런스. ↩︎

이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.

License

CC BY-NC-ND 4.0

이 포스트는 CC BY-NC-ND 4.0 라이선스로 제공됩니다. 출처 표시는 필요하며, 상업적 이용과 변경은 허용되지 않습니다.