[MIT 머신비전 20강] 사진 두 장으로 카메라 자세 찾기: 상대 방향과 위험한 곡면 | 에피폴라 기하·공면 조건
MIT 6.801 머신비전(Machine Vision, Berthold Horn) 20강 정리. 구면 나누기와 회전군, 2차 곡면, 상대 방향(Relative Orientation)과 양안 스테레오, 에피폴라 선, 필요한 대응 점 5개, 공면 조건과 광선 사이의 틈, 위험한 곡면(Critical Surface)을 쉽게 설명합니다.
MIT OpenCourseWare 6.801 20강 원본 영상 (영어)
한 줄 요약: 3D 좌표 없이 사진 두 장만으로 두 카메라의 상대 자세를 찾는 것이 상대 방향 문제입니다. 크기를 알 수 없으니 자유도는 5개, 대응 점도 5쌍이 필요하고, 핵심 조건은 “두 광선과 기준선이 한 평면 위에 있어야 한다”입니다. 그런데 장면이 한 장 쌍곡면처럼 생기면 답이 여러 개가 되어 버립니다.
구를 고르게 나누기 (지난 강의 이어서)
지난 글에서 회전은 4D 단위구 위의 점이라고 했습니다. 이 구를 칸으로 나누는 것을 쪽매 맞춤(tessellation)이라고 합니다. 정다면체를 구에 투영하면 모든 칸의 넓이가 같지만 칸이 큼직합니다.
| 정다면체 | 면 수 | 회전군 크기 |
|---|---|---|
| 정사면체 | 4 | 12 |
| 정육면체 / 정팔면체 | 6 / 8 | 24 |
| 정십이면체 / 정이십면체 | 12 / 20 | 60 |
정팔면체는 정육면체의 쌍대(면의 중심을 이으면 서로가 됨)라서 같은 회전군을 갖고, 정이십면체와 정십이면체도 그렇습니다. 더 촘촘히 나누려면 정사각형과 정삼각형이 섞인 아르키메데스 다면체를 쓰거나(대신 칸 넓이가 조금씩 달라짐), 각 면을 작은 삼각형이나 육각형으로 다시 쪼갭니다.
2차 곡면 가족
뒤에 나올 “위험한 곡면”을 이해하려면 2차 곡면(좌표의 2차식으로 쓰이는 곡면)을 알아야 합니다.
한 장 쌍곡면은 굽은 곡면인데도 직선을 품고 있습니다. 직선 막대를 비스듬히 엮어 만든 탑이 이 모양입니다.
- 한 장 쌍곡면 \(x^2 + y^2 - z^2 = 1\): 허리가 잘록한 원통 모양이고, 곡면 위에 직선을 그을 수 있습니다(ruled surface).
- 평면 두 장도 2차 곡면의 특별한 경우입니다. 두 평면의 식(1차식)을 곱하면 2차식이 되기 때문입니다.
상대 방향: 사진 두 장으로 자세 찾기
17강의 양안 스테레오는 두 카메라의 배치를 정확히 알 때 쉬웠습니다. 실제로는 그 배치, 즉 두 카메라 사이의 상대 방향부터 알아내야 합니다.
- 카메라 두 대가 동시에 찍은 경우(양안 스테레오)든, 카메라 한 대가 움직이며 두 번 찍은 경우(움직임으로부터 구조, 시각 주행 거리계 VO)든 수학은 같습니다. “카메라가 움직였나, 세상이 움직였나”의 쌍대성입니다.
- 찾을 것은 기준선(이동) \(\mathbf{b}\)와 회전입니다.
에피폴라 선: 짝은 선 위에서만 찾는다
두 카메라 중심과 점 P는 한 평면(에피폴라 평면)을 이룹니다. 이 평면이 영상면을 자른 선이 에피폴라 선입니다.
왼쪽 사진의 한 점은 공간에서 광선 하나에 해당합니다. 그 광선 위의 점들을 오른쪽 카메라로 보면 모두 한 직선 위에 찍힙니다. 그래서 짝을 찾을 때 사진 전체가 아니라 선 하나만 뒤지면 됩니다. 이 선이 에피폴라 선이고, 그 선을 만드는 평면이 에피폴라 평면입니다.
- 기준선 전체는 각 사진에서 한 점으로 찍힙니다. 이 점을 에피폴이라 부르고, 모든 에피폴라 선이 여기를 지납니다.
- 다만 이 지름길은 두 카메라의 기하를 이미 알 때만 쓸 수 있습니다. 상대 방향은 바로 그 기하를 찾는 문제입니다.
자유도는 6이 아니라 5
이동 3 + 회전 3 = 6개처럼 보이지만, 사진만으로는 절대 크기를 알 수 없습니다. 장면 전체와 기준선을 두 배로 키워도 사진은 똑같거든요. 그래서 기준선은 길이 1인 방향 벡터(자유도 2)로 두고, 전체 자유도는 5개입니다.
대응 점은 몇 쌍 필요할까
- 1쌍: 턱없이 부족합니다.
- 2쌍: 한 카메라를 돌려도 대응이 유지되는 방향이 남아 조건이 부족합니다.
- 5쌍: 대응 한 쌍이 조건을 1개씩 주므로 5쌍이 필요합니다.
왜 쌍당 1개일까요? 짝의 위치 차이(시차)에는 두 성분이 있습니다. 가로 시차는 깊이에 따라 달라지니 자세에 대한 정보가 아닙니다. 자세를 알려 주는 것은 세로 시차뿐입니다. 실제 장비에서도 세로 시차를 없애도록 정해진 다섯 가지 조정을 반복해 맞췄다고 합니다.
정확도를 위해서는 5쌍보다 많이 쓰고 사진 위에서의 위치 오차(3D 오차가 아니라)의 제곱합을 최소화합니다. 문제는 식이 비선형이라는 점입니다. 2차 방정식 7개짜리라 베주 정리로는 해가 최대 \(2^7 = 128\)개까지 가능하고, 연구를 거쳐 실제 해는 20개로 줄었습니다. 대응을 더 많이 쓰고 사전 지식을 보태면 진짜 해를 고르기 쉬워집니다.
공면 조건: 세 벡터가 한 평면에
에피폴라 평면을 다시 봅시다. 잡음이 없다면 회전을 적용한 왼쪽 광선 \(\mathbf{r}'_l\), 오른쪽 광선 \(\mathbf{r}_r\), 기준선 \(\mathbf{b}\)가 모두 한 평면 위에 있습니다. 세 벡터로 만든 평행육면체의 부피(삼중곱)가 0이라는 뜻입니다.
\[[\mathbf{b}\;\mathbf{r}'_l\;\mathbf{r}_r] = \mathbf{b}\cdot(\mathbf{r}'_l \times \mathbf{r}_r) = 0\]
잡음이 있으면 두 광선이 만나지 않고 비켜 갑니다. 그 틈의 방향은 두 광선 모두에 수직인 \(\mathbf{r}'_l \times \mathbf{r}_r\)입니다.
잡음이 있으면 두 광선이 비켜 가므로, 왼쪽 카메라에서 출발해 오른쪽 카메라로 돌아오는 “고리”를 이렇게 씁니다.
\[\alpha\,\mathbf{r}'_l + \gamma\,(\mathbf{r}'_l \times \mathbf{r}_r) = \mathbf{b} + \beta\,\mathbf{r}_r\]왼쪽 광선을 \(\alpha\)배 가서, 틈 방향으로 \(\gamma\)만큼 건너면, 오른쪽 카메라에서 \(\beta\)배 간 곳과 만난다는 뜻입니다. 양변에 적당한 벡터를 내적하면 항이 대부분 0이 되어 세 미지수가 하나씩 풀립니다.
\[\gamma\,\|\mathbf{r}'_l \times \mathbf{r}_r\|^2 = [\mathbf{b}\;\mathbf{r}'_l\;\mathbf{r}_r], \quad \beta\,\|\mathbf{r}'_l \times \mathbf{r}_r\|^2 = (\mathbf{b}\times\mathbf{r}'_l)\cdot(\mathbf{r}'_l\times\mathbf{r}_r), \quad \alpha\,\|\mathbf{r}'_l \times \mathbf{r}_r\|^2 = (\mathbf{b}\times\mathbf{r}_r)\cdot(\mathbf{r}'_l\times\mathbf{r}_r)\]- 틈의 길이는 \(d = [\mathbf{b}\;\mathbf{r}'_l\;\mathbf{r}_r]/\|\mathbf{r}'_l\times\mathbf{r}_r\|\)로 삼중곱에 비례합니다.
- \(\alpha\)와 \(\beta\)는 양수여야 합니다. 음수면 점이 카메라 뒤에 있다는 뜻이라, 20개 해 중 상당수를 이걸로 걸러 냅니다.
손으로 계산해 보면: 왼쪽 카메라가 원점, 오른쪽 카메라가 \(\mathbf{b} = (1, 0, 0)\)에 있고, 왼쪽 광선이 \(\mathbf{r}'_l = (0.2, 0, 1)\), 오른쪽 광선이 잡음 때문에 살짝 위로 틀어진 \(\mathbf{r}_r = (-0.8, 0.05, 1)\)이라 합시다.
- 외적: \(\mathbf{r}'_l \times \mathbf{r}_r = (0\cdot1 - 1\cdot0.05,\; 1\cdot(-0.8) - 0.2\cdot1,\; 0.2\cdot0.05 - 0) = (-0.05, -1.0, 0.01)\)
- 삼중곱: \(\mathbf{b}\cdot(-0.05, -1.0, 0.01) = -0.05\), 외적의 길이는 \(\approx 1.0013\)
틈의 길이 $$ d \approx 0.05/1.0013 \approx 0.0499\(, 그리고\)\alpha \approx 0.998\(,\)\beta \approx 0.997$$로 둘 다 양수
광선 방향이 5% 틀어지자 두 광선이 기준선 길이의 약 5%만큼 비켜 갔습니다. 잡음이 없었다면(\(\mathbf{r}_r = (-0.8, 0, 1)\)) 외적이 \((0, -1, 0)\)이라 삼중곱이 정확히 0입니다.
가중 최소제곱
틈의 길이 \(d\)는 오차에 비례할 뿐 같지는 않습니다. 먼 점은 사진 위 오차가 작아도 3D 틈이 크게 나오니까요. 그래서 3D 오차를 사진 위 오차로 바꾸는 가중치 \(w_i \approx f/Z_i\)를 곱해
\[\min_{\mathbf{b},\,R} \sum_{i=1}^{n} w_i\,[\mathbf{b}\;\mathbf{r}'_{l,i}\;\mathbf{r}_{r,i}]^2, \qquad \|\mathbf{b}\| = 1\]을 풉니다. 가중치가 답에 따라 바뀌므로 “가중치 갱신 → 다시 풀기”를 번갈아 반복합니다.
사원수로 쓰면
회전을 사원수로 쓰고 \(\mathring{d} = \mathring{b}\,\mathring{q}\)(기준선과 회전을 곱한 사원수)를 도입하면 삼중곱이
\[t = (\mathbf{r}_r \times \mathbf{b})\cdot\mathbf{r}'_l = (\mathring{r}_r\,\mathring{d})\cdot(\mathring{q}\,\mathring{r}_l)\]로 깔끔해집니다. 기준선은 \(\mathring{b} = \mathring{d}\,\mathring{q}^*\)로 되찾습니다. 미지수는 \(\mathring{q}\), \(\mathring{d}\) 합쳐 8개이고, 대응 5개에 조건 3개(\(\|\mathring{q}\| = 1\), \(\|\mathring{b}\| = 1\), \(\mathring{q}\cdot\mathring{d} = 0\))를 더해 개수가 맞습니다. 절대 방향보다 조건이 많아 더 어렵습니다.
- \(\mathring{q}\)와 \(\mathring{d}\)의 부호를 바꾸거나 둘을 맞바꿔도 같은 값이 나오는 대칭이 있어서 해가 여러 벌 나옵니다.
- 하나를 고정하면 다른 하나에 대해 선형 문제가 되어 최소제곱으로 풀 수 있습니다.
- 더 좋은 방법은 레벤버그-마쿼트(LM) 같은 비선형 최적화입니다. LM은 가우스-뉴턴 법에 \(\lambda I\)를 더해 항상 풀리게 만든 방법입니다.
\(J\)는 오차의 야코비안(매개변수에 대한 미분), \(e\)는 오차입니다.
위험한 곡면
상대 방향이 원리적으로 흔들리는 장면이 있습니다. 독일 측량학자들은 이를 “위험한 곡면”(gefährliche Flächen)이라고 불렀습니다.
원 위의 어느 점에서 봐도 같은 현을 보는 각(원주각)은 같습니다. 각만 재서는 원 위 어디인지 알 수 없습니다.
강의의 예는 계곡 위를 나는 비행기입니다. 사진으로는 표지들 사이의 각도만 잴 수 있는데, 계곡처럼 표지들이 원호 모양으로 놓여 있으면 원호 위 여러 위치에서 각이 똑같이 보여 위치를 구별할 수 없습니다. 그래서 항공 측량에서는 계곡보다 능선 위로 경로를 잡습니다.
3D에서는 이 원이 한 장 쌍곡면이 됩니다. 장면의 일부가 한 장 쌍곡면을 닮으면 해가 여러 개가 되거나, 해가 하나여도 잡음에 크게 흔들립니다. 그리고 훨씬 흔한 위험한 곡면이 있습니다. 평면 두 장이 만나는 장면입니다.
\[(ax + by + c)(dx + ey + f) = 0\]두 1차식의 곱은 2차식이니 2차 곡면의 일종입니다. 방의 벽과 바닥, 건물의 두 면처럼 실제로 자주 마주칩니다.
직접 해 보기
① 에피폴라 선. 왼쪽 사진에서 아무 점이나 눌러 보세요. 오른쪽 사진에 보라색 에피폴라 선이 나타나고, “점까지 거리”를 바꾸면 초록 점(진짜 짝)이 그 선을 따라 미끄러집니다.
거리를 1.2m에서 12m까지 바꿔도 초록 점은 보라 선을 절대 벗어나지 않습니다. 카메라 모으기 각도를 0°로 놓으면 두 카메라가 나란해져 에피폴이 무한히 멀어지고, 에피폴라 선이 가로줄이 됩니다. 17강의 나란한 스테레오가 바로 이 경우입니다.
② 위험한 원. 보라 삼각형(비행기)을 끌어 보세요. 파란 점선은 지금과 같은 각으로 두 표지가 보이는 위치들입니다. “원 따라 날기”와 “직선으로 날기”를 비교해 보세요.
원을 따라 날면 각의 변화 폭이 0.00°로, 어디를 날고 있는지 각만으로는 전혀 알 수 없습니다. 직선으로 날면 각이 계속 바뀌어 위치를 구별할 수 있습니다.
정리
- 정다면체로 구를 나누면 칸 넓이가 같고, 회전군 크기는 12, 24, 60입니다.
- 상대 방향은 크기를 모르므로 5자유도이고, 대응 한 쌍은 세로 시차 하나만큼의 조건을 주어 5쌍이 필요합니다.
- 짝은 에피폴라 선 위에만 있고, 핵심 조건은 공면 조건 \([\mathbf{b}\;\mathbf{r}'_l\;\mathbf{r}_r] = 0\)입니다. 잡음이 있으면 삼중곱에 비례하는 틈을 가중 최소제곱으로 줄입니다.
- 장면이 한 장 쌍곡면이나 평면 두 장을 닮으면 답이 여러 개가 되거나 불안정해집니다.
참고: MIT 6.801/6.866 Machine Vision (Fall 2020), Berthold Horn · Ryan Sander · Tadayuki Yoshitake 강의 노트 (MIT OpenCourseWare, CC BY-NC-SA 4.0)