포스트

[MIT 머신비전 5강] 평행한 선이 만나는 점, 소실점으로 카메라 알아내기 | 소실점(Vanishing Point)과 카메라 캘리브레이션

MIT 6.801 머신비전(Machine Vision, Berthold Horn) 5강 정리. 소실점(Vanishing Point) 구하기, 최소제곱과 RANSAC, 소실점 세 개로 카메라 내부 파라미터를 구하는 카메라 캘리브레이션을 쉽게 설명합니다.

[MIT 머신비전 5강] 평행한 선이 만나는 점, 소실점으로 카메라 알아내기 | 소실점(Vanishing Point)과 카메라 캘리브레이션

MIT OpenCourseWare 6.801 5강 원본 영상 (영어)

한 줄 요약: 사진 속에서 평행한 선들은 한 점(소실점)으로 모입니다. 이 점을 잘 찾으면 사진만 보고도 카메라의 초점거리와 방향, 심지어 사진이 잘렸는지까지 알 수 있습니다.

크기가 커지는 속도로 충돌 시간 알기

앞 강의에서 이어지는 이야기부터 합니다. 차가 앞차를 향해 다가가면, 카메라에 찍힌 앞차는 점점 커집니다. 놀라운 점은 거리도 속도도 모르는데 “몇 초 뒤에 부딪힐지”는 알 수 있다는 것입니다.

다가오는 물체의 크기 변화와 충돌 시간 30 m 앞에서 초속 5 m로 다가오는 물체. 사진 속 크기와 그 크기가 커지는 속도만 나누면 남은 시간(4초)이 나옵니다.

사진 속 크기는 거리에 반비례합니다. 그래서 세상에서 거리가 줄어드는 비율과 사진에서 크기가 커지는 비율이 똑같습니다. 식으로는 이렇습니다.

\[\text{충돌까지 남은 시간} = \frac{s}{\;ds/dt\;}\]

\(s\)는 사진 속 크기(픽셀), \(ds/dt\)는 1초에 몇 픽셀씩 커지는지입니다. 크기가 1초에 25%씩 커진다면 대략 4초 남은 셈입니다.

평행한 선은 사진에서 한 점으로 모인다

기찻길에 서서 멀리 보면 두 레일이 지평선의 한 점에서 만나는 것처럼 보입니다. 이 점이 소실점입니다.

도로 사진 속 평행선들이 한 소실점으로 모이는 모습 직접 그린 도로 장면. 도로 가장자리, 울타리 위·아래, 건물의 층선은 모두 같은 방향이라 같은 소실점으로 모입니다.

소실점은 그 방향을 카메라에서 똑바로 바라봤을 때 보이는 자리입니다. 그래서 소실점 위치는 선이 어디 있는지와는 상관없고, 선의 방향만으로 정해집니다. 방향이 다른 평행선 묶음은 각자 다른 소실점을 가집니다.

선이 많으면: 최소제곱과 RANSAC

실제 사진에서 선을 찾으면 조금씩 어긋나서 모든 선이 정확히 한 점을 지나지 않습니다. 그래서 모든 선까지의 거리(의 제곱)를 합한 값이 가장 작은 점을 고릅니다. 이것이 최소제곱(least squares)입니다.

문제는 엉뚱한 선이 섞일 때입니다. 전봇대 그림자나 간판 모서리처럼 다른 방향의 선이 몇 개만 들어와도, 최소제곱은 그쪽으로 끌려갑니다.

최소제곱과 RANSAC의 교점 비교 왼쪽: 엉뚱한 선 4개 때문에 최소제곱 교점이 진짜 소실점에서 벗어났습니다. 오른쪽: RANSAC은 다수결로 그 선들을 빼고 다시 계산합니다.

RANSAC은 “다수결”입니다.

  1. 선 두 개를 아무렇게나 골라 교점을 구합니다.
  2. 그 교점 가까이를 지나는 선이 몇 개인지 셉니다(투표).
  3. 여러 번 반복해서 표를 가장 많이 받은 교점을 고르고, 그 표를 준 선들로만 최소제곱을 다시 합니다.

소실점 세 개면 카메라를 알 수 있다

상자처럼 서로 직각인 세 방향의 모서리가 보이는 사진에는 소실점이 세 개 생깁니다. 이 세 점으로 삼각형을 그리면 재미있는 일이 생깁니다.

정육면체의 세 소실점과 주점, 렌즈 중심의 관계 왼쪽: 정육면체 모서리를 늘이면 세 소실점이 생기고, 삼각형의 세 수선이 만나는 점이 주점입니다. 오른쪽: 렌즈 중심에서 세 소실점으로 그은 선은 서로 직각입니다.

  • 렌즈 중심에서 각 소실점으로 그은 선은 원래 모서리 방향과 같으니 서로 직각입니다.
  • “지름의 양 끝을 바라보는 각은 직각”이라는 성질 때문에, 렌즈 중심은 소실점 두 개를 지름으로 하는 구 위에 있습니다. 구 세 개가 만나는 점을 찾으면 렌즈 중심이 나옵니다.
  • 계산해 보면 렌즈 중심 바로 아래의 점(주점)은 소실점 삼각형의 세 수선이 만나는 점(수심)이고, 그 위로 떠 있는 높이가 초점거리 f입니다.

이걸로 할 수 있는 일이 꽤 많습니다.

  • 카메라 보정: 상자 하나 찍은 사진으로 초점거리와 주점을 구합니다.
  • 사진 잘림 탐지: 자르지 않은 사진이라면 주점은 보통 사진 한가운데에 있습니다. 주점이 한쪽으로 크게 치우쳐 있다면 누군가 사진을 잘라 냈을 수 있습니다.
  • 사진 검증: 강의에서는 북극점에 처음 갔다고 주장한 탐험가의 사진을 이런 식으로 분석해, 실제로는 거기까지 가지 못했다는 근거를 찾은 사례를 소개합니다.
  • 카메라 방향: 렌즈 중심에서 소실점으로 향하는 세 방향이 곧 세상의 x, y, z축이므로, 카메라가 세상에 대해 어떻게 돌아가 있는지(회전)도 바로 나옵니다.

참고로 “구 세 개가 만나는 점 찾기”는 와이파이 공유기 세 대까지의 거리로 실내 위치를 찾는 문제(다변측량)와 똑같은 모양의 문제입니다.

다음 이야기: 밝기로 기울기 알기

강의 후반부는 새 주제로 넘어갑니다. 무광 표면(램버트 표면)은 빛을 비스듬히 받을수록 어둡습니다. 같은 빛 다발이 더 넓은 면적에 퍼지기 때문입니다.

기울기에 따라 판이 받는 빛줄기 수가 줄어드는 모습 같은 판을 45° 기울이면 밝기가 약 71%, 70° 기울이면 약 34%로 줄어듭니다(코사인 법칙).

\[E = \rho \cos\theta\]

\(E\)는 보이는 밝기, \(\rho\)는 표면이 빛을 얼마나 되돌려 보내는지(알베도, 0~1), \(\theta\)는 빛과 표면의 수직 방향 사이의 각입니다. 거꾸로, 밝기를 재면 표면이 얼마나 기울었는지 알 수 있다는 뜻입니다. 다만 사진 한 장으로는 정보가 모자라서, 조명을 바꿔 가며 세 장을 찍는 방법이 나옵니다. 이건 다음 글에서 자세히 봅니다.

직접 해 보기

① 소실점 찾기. 파란 선의 끝점(동그라미)을 끌어 보고, “엉뚱한 선 추가”를 몇 번 눌러 보세요. 주황 ✕(최소제곱)는 끌려가지만 초록 ◯(RANSAC)는 버팁니다.

② 소실점 세 개로 카메라 보정. 세 소실점을 끌어 보세요. 보라색 점이 주점, 보라색 원의 반지름이 초점거리입니다. 삼각형이 둔각이 되면 계산이 안 되는 것도 확인해 보세요.

정리

  • 사진 속 크기와 크기가 커지는 속도만 알면, 거리와 속도를 몰라도 충돌까지 남은 시간을 알 수 있습니다.
  • 평행한 선은 사진에서 소실점 하나로 모이며, 엉뚱한 선이 섞이면 RANSAC 같은 다수결 방식으로 걸러 냅니다.
  • 서로 직각인 세 방향의 소실점이 있으면 주점(수심)과 초점거리, 카메라 방향까지 구할 수 있습니다.
  • 무광 표면의 밝기는 빛을 받는 각도의 코사인에 비례해서, 밝기로 표면 기울기를 거꾸로 추정할 수 있습니다.

다음 글: [MIT 머신비전 6강] 조명 세 개로 표면의 방향 알아내기

참고: MIT 6.801/6.866 Machine Vision (Fall 2020), Berthold Horn · Ryan Sander · Tadayuki Yoshitake 강의 노트 (MIT OpenCourseWare, CC BY-NC-SA 4.0)

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