[MIT 머신비전 22강] 지도와 사진으로 내 위치 찾기, 그리고 모양을 구 위에 펼치기 | 외부 방향·번들 조정·확장 가우스 영상
MIT 6.801 머신비전(Machine Vision, Berthold Horn) 22강 정리. 외부 방향(Exterior Orientation)으로 위치와 자세 찾기, 번들 조정(Bundle Adjustment), 3D 물체를 나타내는 방법과 확장 가우스 영상(EGI), 2D 확장 원 영상과 곡률·밀도를 쉽게 설명합니다.
MIT OpenCourseWare 6.801 22강 원본 영상 (영어)
한 줄 요약: 위치를 아는 표지 세 개가 사진에 보이면, 표지들 사이의 각도만으로 내 위치(해 2개)와 자세를 구할 수 있습니다. 카메라와 표지가 여럿이면 모두를 한꺼번에 다듬는 번들 조정을 씁니다. 강의 후반은 물체 인식으로 넘어가, 물체의 겉면을 법선 방향별 넓이로 구 위에 펼친 확장 가우스 영상을 소개합니다.
외부 방향: 사진 한 장 + 지도 = 내 위치
17강의 네 문제 중 남은 하나, 외부 방향(2D↔3D)입니다. 드론이 땅을 내려다보는데, 땅 위 표지 \(p_1, p_2, p_3\)의 위치는 지도로 알고 있고, 드론의 위치 \(p_0\)와 자세를 모른다고 합시다(Church의 삼각대 문제).
- 미지수: 위치 3 + 회전 3 = 6자유도
- 카메라 내부 성질 \((x_0, y_0, f)\)은 이미 보정되어 있다고 가정합니다.
- 대응 하나가 사진 좌표 두 개를 주니, 최소 3쌍이 필요합니다.
사진에서 바로 재는 것은 표지들 사이의 각도입니다. 거기서 거리를 구하면 위치는 구들의 교점입니다.
1단계: 각도 → 거리 → 위치
사진 속 두 점의 방향 벡터로 둘 사이의 각 \(\theta_{12}\), \(\theta_{13}\), \(\theta_{23}\)을 잽니다(내적으로 코사인, 외적으로 사인, 아크탄젠트로 각도). 표지끼리의 거리는 지도로 압니다. 이제 드론과 두 표지가 이루는 삼각형마다 코사인 법칙이 성립합니다.
\[\|p_i - p_j\|^2 = r_i^2 + r_j^2 - 2 r_i r_j \cos\theta_{ij}\]\(r_i\)는 드론에서 표지 \(i\)까지의 거리입니다. 세 삼각형에서 식 세 개, 미지수 \(r_1, r_2, r_3\) 세 개라 풀 수 있습니다. 거리를 알면 드론은 반지름 \(r_i\)인 세 구의 교점에 있습니다.
- 세 구는 보통 두 점에서 만나므로 해가 2개입니다(땅 위와 땅 아래의 거울상 같은 것). 표지가 더 있으면 하나로 줄어듭니다.
- 거울상 해는 사진 속 표지의 도는 순서(시계 방향인지 반대인지)가 뒤집히므로 그걸로 걸러 낼 수 있습니다.
- 회전과 위치는 서로 얽혀 있어서 자세만 따로 먼저 풀 수는 없습니다.
2단계: 자세
위치 \(p_0\)를 알면 각 표지로 가는 방향을 세상 좌표로 알 수 있습니다.
\[\mathbf{b}_i = p_i - p_0\]사진 속 방향 \(\hat{\mathbf{a}}_i\)(카메라 좌표)를 세상 방향 \(\hat{\mathbf{b}}_i\)로 보내는 회전이 자세입니다. 세 쌍을 나란히 세워 행렬로 쓰면
\[R\,(\hat{\mathbf{a}}_1\;\hat{\mathbf{a}}_2\;\hat{\mathbf{a}}_3) = (\hat{\mathbf{b}}_1\;\hat{\mathbf{b}}_2\;\hat{\mathbf{b}}_3) \quad\Longrightarrow\quad R = B A^{-1}\]그런데 잡음이 있으면 이 \(R\)이 정확한 직교 행렬이 아닐 수 있습니다. 실제로는 표지를 3개보다 많이 쓰고, 3점 해를 출발점으로 최소제곱을 풉니다. 좋은 출발점이 있어야 엉뚱한 국소 최솟값에 빠지지 않습니다. 그리고 오차는 3D가 아니라 사진 위에서 생기므로 최적화도 사진 위 오차로 합니다.
번들 조정: 전부 한꺼번에
이번에는 표지 \(K\)개를 카메라 \(N\)대가 찍었고, 모든 것을 모릅니다.
- 표지의 3D 위치 \(\{p_i\}\)
- 카메라 위치 \(\{c_j\}\)와 자세 \(\{R_j\}\)
- 카메라 내부 성질 \(\{x_{0j}, y_{0j}, f_j, \ldots\}\)
각 카메라에서 나가는 광선 다발(bundle)들이 표지에서 가장 잘 만나도록 모든 미지수를 함께 조정합니다.
모든 관측의 사진 위 재투영 오차를 최소화하는 거대한 비선형 최소제곱 문제이고, 보통 레벤버그-마쿼트로 풉니다. 여기서도 좋은 초기값이 중요합니다. 대응점은 SIFT, SURF, ORB, BRIEF 같은 특징점 검출기와 기술자로 찾습니다.
3D 물체는 어떻게 나타낼까
강의 후반은 3D 인식입니다. 물체를 알아보고 자세를 맞추려면 먼저 물체를 어떤 형태로 저장할지 정해야 합니다.
- 다면체: 블록 세상 문제에는 좋지만 현실의 매끈한 물체에는 맞지 않습니다.
- 메시(작은 다각형 조각의 모음): 그리기에는 좋지만 인식과 정렬에는 나쁩니다. 꼭짓점이 특별한 뜻이 없고, 만들 때마다 위치가 달라지기 때문입니다.
- 일반화 원기둥: 단면을 축을 따라 밀어내며(크기는 바뀌어도 됨) 만드는 방식입니다. 그런데 구는 축이 무한히 많아 표현이 하나로 정해지지 않고, 정렬에서도 잘 통하지 않았습니다.
바라는 성질은 두 가지입니다.
- 이동해도 표현이 그대로일 것
- 회전하면 표현도 예측 가능하게 똑같이 돌 것
확장 가우스 영상 (EGI)
답은 겉면을 방향별로 모으는 것입니다. 다면체라면 면마다 바깥 법선 × 넓이를 하나의 벡터로 적습니다. 닫힌 다면체에서는 이 벡터들의 합이 항상 0입니다.
\[\sum_{i=1}^{N} A_i\,\hat{\mathbf{n}}_i = \mathbf{0}\]
2D로 보면 쉽습니다. 각 변의 “법선 × 길이” 벡터는 변을 90° 돌린 것이라, 이어 붙이면 원래 다각형을 돌린 모양으로 제자리에 돌아옵니다.
이 질량들을 단위구 위의 해당 방향 자리에 올려놓은 것이 확장 가우스 영상(Extended Gaussian Image, EGI)입니다.
- 법선과 넓이는 위치와 상관없으니 이동해도 그대로입니다.
- 물체를 돌리면 구 위의 질량 분포도 똑같이 돕니다. 그래서 정렬 문제가 “두 구의 질량 분포를 맞추는 회전 찾기”가 됩니다.
- 평평한 면은 법선이 모두 같아 구 위 한 점에 몰립니다.
- 민코프스키가 증명했듯, 볼록한 다면체는 EGI가 같으면 모양도 같습니다(증명이 구성적이지 않아 모양을 되살리는 알고리즘은 느리지만, 인식에는 되살릴 필요가 없습니다).
매끈한 곡면에서는 질량 대신 밀도를 씁니다. 겉면이 많이 휘는 곳(곡률이 큰 곳)은 법선이 빨리 바뀌어 구 위에 넓게 흩어지니 밀도가 낮고, 평평한 곳은 밀도가 높습니다. 즉 밀도는 곡률의 역수입니다.
2D로 연습: 확장 원 영상
2D 곡선에서는 단위원 위에 펼칩니다. 곡선을 따라 길이 \(s\)만큼 갈 때 법선 각 \(\eta\)가 얼마나 도는지가 곡률이고, 그 역수가 밀도 \(G\)입니다.
\[\kappa = \frac{d\eta}{ds} = \frac{1}{R_{\text{곡률}}}, \qquad G(\eta) = \frac{ds}{d\eta} = \frac{1}{\kappa}\]\(G(\eta)\)만 있으면 곡선을 되살릴 수도 있습니다. 법선이 \(\eta\)일 때 접선 방향은 \((-\sin\eta, \cos\eta)\)이니
\[x = x_0 + \int -\sin\eta\; G(\eta)\, d\eta, \qquad y = y_0 + \int \cos\eta\; G(\eta)\, d\eta\]닫힌 곡선이라면 한 바퀴 돌았을 때 제자리여야 하므로
\[\int_0^{2\pi} \sin\eta\; G(\eta)\, d\eta = 0, \qquad \int_0^{2\pi} \cos\eta\; G(\eta)\, d\eta = 0\]즉 밀도의 무게중심이 원의 중심에 있어야 합니다. 다각형의 “합 = 0”과 같은 이야기입니다.
원(반지름 \(R\))은 곡률이 \(1/R\)로 일정하니 밀도도 \(G = R\)로 일정합니다. 어느 방향이든 똑같아서 방향 정보가 없습니다. 한 바퀴 적분하면 \(\int_0^{2\pi} R\, d\eta = 2\pi R\), 정확히 둘레입니다.
타원은 다릅니다. 장축 \(a\), 단축 \(b\)인 타원에서 법선 각 \(\eta\)인 곳의 곡률은
\[\kappa(\eta) = \frac{(a^2\cos^2\eta + b^2\sin^2\eta)^{3/2}}{a^2 b^2}\]
타원의 확장 원 영상에는 봉우리가 두 개 있고, 그 위치가 타원이 어느 쪽으로 누워 있는지 알려 줍니다.
손으로 계산해 보면: \(a = 2\), \(b = 1\)일 때
- 뾰족한 끝(\(\eta = 0°\)): \(\kappa = a^3/(a^2b^2) = a/b^2 = 2\), 밀도 \(G = 0.5\)
- 평평한 옆(\(\eta = 90°\)): \(\kappa = b^3/(a^2b^2) = b/a^2 = 0.25\), 밀도 \(G = 4\)
- \(G(\eta)\)를 한 바퀴 적분하면 약 9.688로, 이 타원의 둘레와 같습니다. \(\int G\,d\eta = \int ds\)이니까요.
곡률의 극값은 \(\pi/2\) 간격으로 네 번 나오고, 두 타원을 맞추려면 이 봉우리들이 겹치도록 돌리면 됩니다. 맞춘 뒤에도 잘 안 겹치면 애초에 타원이 아닌 겁니다. 볼록하지 않은 곡선은 같은 법선이 여러 곳에서 나오므로(여러 점이 원의 한 점으로) 되살리기가 하나로 정해지지 않습니다.
3D로: 가우스 곡률
3D에서는 겉면의 작은 조각 넓이 \(\delta O\)와, 그 조각의 법선들이 구 위에 차지하는 넓이 \(\delta S\)의 비가 가우스 곡률입니다.
\[\kappa = \lim \frac{\delta S}{\delta O}, \qquad G = \frac{1}{\kappa} = \lim \frac{\delta O}{\delta S}\]반지름 \(R\)인 구는 \(\kappa = 1/R^2\), \(G = R^2\)로 일정합니다. 2D의 원과 마찬가지로 방향 정보가 없습니다. 안장점처럼 볼록하지 않은 곳은 겉면을 한 바퀴 돌 때 구 위에서는 반대 방향으로 돌아 곡률이 음수가 되고, 여러 곳이 구의 같은 점으로 겹칩니다. 다음 강의에서는 이 EGI를 더 자세히 다룹니다.
직접 해 보기
① 다각형의 확장 원 영상. 꼭짓점을 끌거나 다각형 전체를 옮기고, 슬라이더로 돌려 보세요.
어떻게 바꿔도 “법선 × 길이의 합”은 (0.00, 0.00)입니다. 다각형을 옮기면 오른쪽 그림은 꿈쩍도 하지 않고, 돌리면 막대들이 같은 각도만큼 함께 돕니다. 꼭짓점 하나를 안쪽으로 밀어 넣어 오목하게 만들면 경고가 뜹니다.
② 표지 세 개로 내 위치 찾기 (2D). 표지 사이의 두 각 \(\theta_{12}\), \(\theta_{23}\)은 각각 원 하나씩을 정하고, 카메라는 두 원의 교점에 있습니다. 카메라를 끌어 보세요.
처음 위치에서 각을 ±0.5° 틀리면 위치 오차가 최대 17.9px입니다. 카메라를 표지 쪽으로 올리면(예: 세로 200px 근처) 2~3px로 줄어듭니다. 반대로 주황 원(세 표지를 모두 지나는 원) 위로 끌고 가면 두 원이 겹쳐 버려 오차가 수백 px로 폭발합니다. 20강의 위험한 곡면과 같은 현상의 2D판입니다.
정리
- 외부 방향: 사진 속 각도 → 코사인 법칙으로 거리 → 구들의 교점으로 위치(해 2개), 그다음 방향 벡터들을 맞춰 자세를 구합니다. 최종 다듬기는 사진 위 오차로 합니다.
- 번들 조정은 표지와 카메라의 모든 미지수를 재투영 오차 최소화로 한꺼번에 다듬습니다.
- 확장 가우스 영상은 겉면을 법선 방향별 넓이(밀도 = 1/곡률)로 구 위에 펼친 것입니다. 이동에 무관하고, 회전하면 함께 돌며, 볼록한 물체라면 모양을 하나로 정합니다.
- 2D에서는 \(G(\eta) = ds/d\eta\)이고, 원은 일정, 타원은 봉우리 두 개를 가집니다.
참고: MIT 6.801/6.866 Machine Vision (Fall 2020), Berthold Horn · Ryan Sander · Tadayuki Yoshitake 강의 노트 (MIT OpenCourseWare, CC BY-NC-SA 4.0)