[MIT 머신비전 17강] 두 좌표계 맞추기의 시작: 사진 측량과 절대 방향 | 양안 스테레오·관성 축
MIT 6.801 머신비전(Machine Vision, Berthold Horn) 17강 정리. 사진 측량(Photogrammetry)의 네 가지 문제, 양안 스테레오(Binocular Stereo)로 거리 재기, 절대 방향(Absolute Orientation)의 최소제곱 정식화, 관성 축과 무게중심으로 이동 분리하기를 쉽게 설명합니다.
MIT OpenCourseWare 6.801 17강 원본 영상 (영어)
한 줄 요약: 같은 점들을 서로 다른 두 좌표계에서 쟀다면, 두 좌표계 사이의 회전과 이동을 찾을 수 있습니다. 이동은 두 점 구름의 무게중심 차이로 바로 나오고, 남는 회전이 진짜 문제입니다. 이 강의는 그 문제를 세우고, 쉬운 방법 두 가지가 왜 부족한지 보여 줍니다.
이제 “사진으로 재는” 문제로
지금까지는 경계를 찾고, 패턴을 맞추고, 흐리게 만드는 저수준 영상 처리였습니다. 이번 강의부터는 한 단계 올라가 사진으로 위치와 방향을 재는 문제, 즉 사진 측량(photogrammetry, 원래 뜻은 “사진으로부터의 측정”, 대표적인 예가 지도 만들기)을 다룹니다.
사진 측량에는 크게 네 가지 문제가 있습니다. 무엇과 무엇을 맞추느냐로 나뉩니다.
이번 강의와 다음 두 강의는 첫 번째, 절대 방향을 다룹니다.
- 절대 방향(3D↔3D): 라이다 두 대가 같은 장면을 쟀을 때 두 라이다의 상대 자세를 찾습니다. 한 센서로 물체를 두 번 쟀을 때 물체가 얼마나 움직였는지도 같은 문제입니다.
- 상대 방향(2D↔2D): 카메라 두 대의 사진만으로 두 카메라 사이의 자세를 찾습니다. 양안 스테레오가 대표적입니다.
- 외부 방향(2D↔3D): 사진 한 장과 3D 지도로 내가 어디에 어느 방향으로 있는지 찾습니다. 로봇의 위치 추정이 여기 속합니다.
- 내부 방향(3D↔2D): 카메라 자체의 성질(초점거리, 중심점 등)을 찾습니다. 즉 카메라 보정입니다.
두 눈으로 거리 재기: 양안 스테레오
사람은 거리를 느끼는 단서를 열 가지 넘게 쓰는데, 그중 하나가 두 눈의 차이입니다. 카메라 두 대를 나란히 놓고 같은 점을 보면, 두 사진에서 그 점의 위치가 살짝 다릅니다.
두 카메라는 기준선 \(b\)만큼 떨어져 있고, 같은 점 P가 두 사진에 서로 다른 위치 \(x_l, x_r\)로 찍힙니다.
원점을 두 카메라의 한가운데에 두고 닮은 삼각형을 쓰면
\[\frac{x_l}{f} = \frac{X + b/2}{Z}, \qquad \frac{x_r}{f} = \frac{X - b/2}{Z}\]여기서 \(f\)는 초점거리, \((X, Z)\)는 점의 가로 위치와 깊이입니다. 두 식을 빼면 시차(disparity) \(d = x_l - x_r\)이 나오고, 거리가 바로 풀립니다.
\[d = x_l - x_r = \frac{bf}{Z} \quad\Longrightarrow\quad Z = \frac{bf}{x_l - x_r}, \qquad X = \frac{b}{2}\,\frac{x_l + x_r}{x_l - x_r}\]손으로 계산해 보면: 기준선 \(b = 12\)cm, 초점거리 \(f = 800\)픽셀인 카메라 쌍이 시차 \(d = 64\)픽셀을 쟀다면
\[Z = \frac{12 \times 800}{64} = 150\text{cm}\]시차를 1픽셀 틀려 63이나 65로 재면 거리는 152.4cm나 147.7cm가 됩니다. 같은 카메라로 3m 떨어진 점을 보면 시차가 32픽셀뿐이라, 1픽셀 오차가 약 ±9.5cm로 커집니다. 멀수록 시차가 작아져 오차가 거리의 제곱에 비례해 커집니다.
- 기준선 \(b\)를 늘리면 시차가 커져 더 정밀해집니다.
- 하지만 자동차에 카메라를 100m 떨어뜨려 달 수는 없듯, 실제로는 장치 크기의 제약이 있습니다.
- 그리고 실제로는 두 카메라를 완벽히 나란히 맞추기가 거의 불가능합니다. 그래서 두 카메라 사이의 정확한 회전과 이동을 알아내는 문제가 필요해집니다.
절대 방향: 문제 세우기
이제 일반적인 경우입니다. 같은 점 \(p_i\)들을 두 좌표계에서 잰 값 \(r_{l,i}\)(왼쪽), \(r_{r,i}\)(오른쪽)이 있습니다. 두 좌표계 사이의 관계는 회전 + 이동입니다.
\[r_r = R(r_l) + r_0\]\(R\)은 회전, \(r_0\)은 이동 벡터입니다. 이 둘이 우리가 찾을 미지수입니다.
자유도는 몇 개일까요? \(d\)차원에서 이동은 \(d\)개, 회전은 \(d(d-1)/2\)개라서 3D에서는 이동 3 + 회전 3 = 6자유도입니다.
\[\text{DOF}(d) = d + \frac{d(d-1)}{2} \quad\Longrightarrow\quad \text{DOF}(3) = 6\]회전을 3×3 행렬로 쓰면 숫자는 9개지만 조건이 붙습니다.
- \(R^T R = I\): 각 줄의 길이가 1이고 서로 수직입니다(직교 행렬).
- \(\det R = +1\): 거울에 비친 것처럼 뒤집는 변환(반사)을 막습니다.
이런 조건을 다 만족하는 행렬들의 모임을 \(SO(3)\)(특수 직교군)라고 부릅니다. 조건이 붙은 공간이라 그 위에서 최적화하기가 까다롭습니다.
스프링으로 생각하기 = 최소제곱
측정에는 잡음이 있으니 모든 점이 완벽히 맞지는 않습니다. 15강의 PatMax처럼, 짝지은 점끼리 스프링으로 연결했다고 생각해 봅시다. 스프링 하나의 에너지는 늘어난 길이 \(e\)의 제곱에 비례합니다.
\[E = \tfrac{1}{2} k e^2\]전체 에너지가 가장 작은 자세를 찾는 것은 곧 오차 제곱합을 최소화하는 것입니다.
\[e_i = R(r_{l,i}) + r_0 - r_{r,i}, \qquad \min_{R,\, r_0} \sum_{i=1}^{N} \|e_i\|^2\]이것은 “역문제”입니다. 자세를 알고 점의 위치를 예측하는 것(순문제)은 쉽지만, 점들로부터 자세를 찾는 것은 어렵습니다.
쉬운 방법 1: 세 점으로 좌표축 만들기
가장 먼저 떠오르는 방법은 점 세 개로 각 좌표계 안에 새 좌표축을 직접 만드는 것입니다.
점 1은 위치 전체가, 점 2는 방향만, 점 3은 평면을 정하는 데만 쓰입니다.
- 점 1을 원점으로 삼습니다.
- 점 1에서 점 2로 가는 방향을 \(\hat{x}\)축으로 삼습니다.
- 점 1에서 점 3으로 가는 벡터에서 \(\hat{x}\) 성분을 빼면 \(\hat{x}\)에 수직인 \(\hat{y}\)축이 됩니다.
- \(\hat{z} = \hat{x} \times \hat{y}\)로 마지막 축을 얻습니다.
양쪽 좌표계에서 똑같이 하면, 두 축 묶음을 맞추는 회전이 바로 나옵니다.
\[\begin{pmatrix} \hat{x}_r & \hat{y}_r & \hat{z}_r \end{pmatrix} = R \begin{pmatrix} \hat{x}_l & \hat{y}_l & \hat{z}_l \end{pmatrix} \;\Longrightarrow\; R = \begin{pmatrix} \hat{x}_r & \hat{y}_r & \hat{z}_r \end{pmatrix}\begin{pmatrix} \hat{x}_l & \hat{y}_l & \hat{z}_l \end{pmatrix}^{-1}\]축들이 서로 수직이라 역행렬은 언제나 있습니다. 하지만 점마다 대접이 다릅니다. 점 1은 조건 3개가 다 쓰이고, 점 2는 2개, 점 3은 1개만 쓰입니다. 점 4부터는 아예 쓰이지 않고요. 첫 추측으로는 괜찮지만 최선은 아닙니다.
쉬운 방법 2: 관성 축 맞추기
13강의 덩어리 분석에서는 픽셀을 세어 면적과 무게중심을 구했습니다. 한 걸음 더 나가면 모양이 어느 쪽으로 길쭉한지를 관성 축으로 잴 수 있습니다. 점 구름을 어떤 축 \(\hat{\omega}\) 둘레로 돌릴 때의 관성은 각 점에서 축까지 거리의 제곱합입니다.
축까지 거리의 제곱은 피타고라스 정리로 \(r \cdot r - (r \cdot \hat{\omega})^2\)입니다(전체 길이² − 축 방향 성분²). 이걸 정리하면 행렬 하나가 나옵니다.
\[I(\hat{\omega}) = \sum_i \left( r_i \cdot r_i - (r_i \cdot \hat{\omega})^2 \right) = \hat{\omega}^T \underbrace{\left( \sum_i (r_i \cdot r_i) I_3 - r_i r_i^T \right)}_{A:\ \text{관성 행렬}} \hat{\omega}\]이 값이 가장 작은 축, 가장 큰 축, 그 중간(안장점)은 각각 관성 행렬 \(A\)의 고유벡터입니다. 세 고유벡터가 서로 수직이니 그대로 좌표축이 됩니다. 원점은 무게중심에 둡니다.
구름을 돌리면 축도 똑같이 돌아가므로, 두 좌표계의 축을 맞추면 회전이 나옵니다. 하지만 대칭인 모양에서는 축이 정해지지 않습니다.
방법 1보다 낫습니다.
- 모든 점을 씁니다.
- 모든 점을 똑같이 대접합니다.
그런데 실제로는 잘 쓰이지 않습니다. 구, 정육면체, 정팔면체처럼 대칭인 물체는 모든 방향의 관성이 같아 축을 고를 수 없기 때문입니다. 게다가 이 방법은 “어느 점이 어느 점과 짝인지”(대응) 정보를 전혀 쓰지 않습니다. 대응을 쓰면 정보가 늘지만, 안 쓰는 대신 대칭에 취약해지는 양날의 검입니다.
이동부터 떼어 내기: 무게중심의 힘
이제 제대로 된 최소제곱으로 갑니다. 먼저 회전의 성질 몇 가지를 기억해 둡니다. 회전은
- 내적을 보존하고: \(R(a) \cdot R(b) = a \cdot b\)
- 길이를 보존하고: \(\|R(a)\| = \|a\|\)
- 삼중곱(부피)을 보존합니다: \([R(a)\,R(b)\,R(c)] = [a\,b\,c]\)
핵심 요령은 각 점 구름의 무게중심을 빼는 것입니다.
\[\bar{r}_l = \frac{1}{N}\sum_i r_{l,i}, \quad \bar{r}_r = \frac{1}{N}\sum_i r_{r,i}, \qquad r'_{l,i} = r_{l,i} - \bar{r}_l, \quad r'_{r,i} = r_{r,i} - \bar{r}_r\]
무게중심을 원점으로 옮기면 두 점 구름은 원점 둘레로 돌리기만 하면 겹칩니다.
새 좌표로 오차를 다시 쓰고 전개하면, 이동에 관한 항이 \(N\|r'_0\|^2\) 하나로 떨어져 나옵니다(무게중심을 뺀 좌표의 합이 0이라 섞인 항이 사라집니다). 이 항은 \(r'_0 = 0\)일 때 가장 작으니, 원래 이동 벡터는
\[r_0 = \bar{r}_r - R(\bar{r}_l)\]왼쪽 무게중심을 돌린 다음, 오른쪽 무게중심과의 차이가 곧 이동입니다. 회전만 알면 이동은 공짜로 따라옵니다.
남은 것은 회전입니다. 오차 제곱합을 펼치면 \(\sum \|r'_{r,i}\|^2\)과 \(\sum \|r'_{l,i}\|^2\)은 회전과 무관한 상수(회전은 길이를 보존하니까)이고, 남는 항을 정리하면
\[\max_R \sum_{i=1}^{N} r'_{r,i} \cdot R(r'_{l,i})\]돌린 왼쪽 점과 오른쪽 점이 최대한 같은 방향을 가리키게 하라는 뜻입니다. 그런데 \(R\)이 직교 행렬이라는 조건 때문에 그냥 미분해서 0으로 놓을 수가 없습니다. 이 문제를 깔끔하게 푸는 열쇠가 다음 강의의 사원수입니다.
직접 해 보기
① 두 눈으로 거리 재기. 주황 점을 끌어 멀리 보내 보세요. 위쪽의 두 작은 사진에서 점의 위치 차이(시차)가 줄어들고, 주황 띠(1픽셀 오차일 때의 거리 범위)가 길어집니다.
처음 상태(기준선 12cm, 거리 150cm)에서 시차는 64픽셀, 1픽셀 오차의 범위는 148~152cm입니다. 점을 300cm로 보내면 범위가 291~310cm로 늘어납니다. 기준선을 36cm로 늘리면 같은 300cm에서도 범위가 다시 297~303cm로 줄어듭니다.
② 관성 축. 점을 끌어 보면서 두 축이 어떻게 따라 도는지 보세요. “정사각형 (대칭)”을 누르면 두 관성이 같아져 축이 사라집니다.
정사각형 상태에서 점 하나만 살짝 끌어도 축이 갑자기 나타나는데, 조금 더 끌면 축 방향이 크게 휙 바뀝니다. 대칭에 가까울수록 작은 잡음에도 답이 크게 흔들린다는 뜻입니다.
정리
- 사진 측량은 맞추는 대상에 따라 절대(3D↔3D), 상대(2D↔2D), 외부(2D↔3D), 내부(3D↔2D) 방향 문제로 나뉩니다.
- 양안 스테레오는 시차로 거리를 잽니다: \(Z = bf/d\). 멀수록 오차가 빠르게 커집니다.
- 절대 방향은 회전 3 + 이동 3 = 6자유도를 찾는 최소제곱 문제입니다.
- 세 점 방법은 점을 차별하고, 관성 축 방법은 대칭에 약합니다.
- 무게중심을 빼면 이동이 분리되고 \(r_0 = \bar{r}_r - R(\bar{r}_l)\), 남는 문제는 \(\max_R \sum r'_r \cdot R(r'_l)\)입니다.
참고: MIT 6.801/6.866 Machine Vision (Fall 2020), Berthold Horn · Ryan Sander · Tadayuki Yoshitake 강의 노트 (MIT OpenCourseWare, CC BY-NC-SA 4.0)