포스트

[MIT 머신비전 21강] 카메라의 속사정 알아내기: 방사 왜곡과 Tsai 보정법 | 내부 방향·위험한 곡면 마무리

MIT 6.801 머신비전(Machine Vision, Berthold Horn) 21강 정리. 위험한 곡면의 세 가지 해와 넓은 시야, 내부 방향(Interior Orientation)과 방사 왜곡(Radial Distortion), Tsai의 카메라 보정법(선형 단계, 직교화, f와 t_z 분리, 비선형 다듬기), 평면 과녁과 잡음 민감도를 쉽게 설명합니다.

[MIT 머신비전 21강] 카메라의 속사정 알아내기: 방사 왜곡과 Tsai 보정법 | 내부 방향·위험한 곡면 마무리

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

한 줄 요약: 카메라 보정은 “알고 있는 점들이 사진 어디에 찍혔나”로 카메라의 초점거리, 중심점, 렌즈 왜곡을 알아내는 일입니다. Tsai의 방법은 비율을 써서 어려운 미지수를 먼저 지우고 선형 방정식으로 대부분을 푼 뒤, 남은 것만 반복 최적화로 다듬습니다. 단, 과녁을 정면으로만 찍으면 초점거리와 거리를 구별할 수 없습니다.

위험한 곡면, 마저 보기

지난 글에서 장면이 한 장 쌍곡면을 닮으면 상대 방향이 흔들린다고 했습니다. 2차 곡면은 부호 조합에 따라 네 종류입니다.

\[\pm\frac{x^2}{a^2} \pm \frac{y^2}{b^2} \pm \frac{z^2}{c^2} = 1\]

\(+++\)는 타원면, \(++-\)는 한 장 쌍곡면, \(+--\)는 두 장 쌍곡면, \(---\)는 실제 점이 없는 허수 타원면입니다. 한 장 쌍곡면을 상대 방향 식에 넣고 풀면 세 종류의 해가 나오는데, 각각 뜻이 있습니다.

  • 오른쪽 카메라 중심이 곡면 위에 있음: 움직임으로 보면 “다음 순간 곡면 위로 올라선다”는 뜻입니다.
  • 왼쪽 카메라 중심도 곡면 위에 있음: 양안이라면 “곡면이 두 눈을 모두 지나야” 합니다.
  • 기준선 전체가 곡면 위에 있음: 곡면이 직선을 품는다는 뜻이고, 한 장 쌍곡면은 실제로 각 점마다 직선 두 개가 지나갑니다. 다만 이런 배치는 드뭅니다.

현실에서 훨씬 흔한 위험한 곡면은 평면 두 장의 교차입니다. 두 평면 식의 곱 \((a_1X + b_1Y + c_1Z + d_1)(a_2X + b_2Y + c_2Z + d_2) = 0\)은 2차식이니까요. 이때 한 평면은 에피폴라 평면(사진에서는 선 하나로 보임)이어야 하고, 다른 평면은 아무거나 됩니다.

정확히 위험한 곡면이 아니어도 근처만 가도 잡음이 크게 증폭됩니다. 대책은 시야를 넓히는 것입니다. 넓게 볼수록 장면 전체가 우연히 위험한 곡면을 닮을 가능성이 줄어듭니다. 그래서 카메라 8대를 단단히 묶어 사진을 이어 붙이는 “거미 머리”(spider head) 같은 장비도 씁니다. 대신 카메라끼리의 보정이 필요합니다.

내부 방향: 카메라 자신을 알아내기

17강의 네 문제 중 마지막, 내부 방향입니다. 3D 점이 사진의 어느 픽셀에 찍히는지를 정하는 카메라 자체의 성질을 찾는 일, 곧 카메라 보정입니다.

  • 초점거리 \(f\)
  • 주점 \((x_0, y_0)\): 광축이 사진과 만나는 점
  • 렌즈 왜곡 계수

방사 왜곡

실제 렌즈는 완벽한 바늘구멍이 아니라서, 점이 왜곡 중심에서 바깥쪽(또는 안쪽)으로 조금씩 밀려 찍힙니다. 밀리는 양은 중심에서의 거리 \(r\)의 다항식으로 씁니다.

\[\delta x = x\,(k_1 r^2 + k_2 r^4 + \cdots), \qquad \delta y = y\,(k_1 r^2 + k_2 r^4 + \cdots), \qquad r = \sqrt{x^2 + y^2}\]

왜곡 없는 격자, k₁이 음수인 술통형 왜곡, k₁이 양수인 바늘꽂이형 왜곡. 곧아야 할 다림줄이 휘어 보인다 원래 곧은 줄(다림줄)을 찍어 보면 왜곡이 한눈에 보입니다. 중심에서 멀수록 더 크게 휩니다.

  • \(k_1 < 0\): 바깥쪽이 오므라드는 술통형
  • \(k_1 > 0\): 바깥쪽이 늘어나는 바늘꽂이형
  • 곧은 다림줄을 찍어 휘어진 정도로 왜곡을 잴 수 있습니다.

왜곡 모델에는 몇 가지 선택이 있습니다.

  • 방향: 왜곡 없는 좌표 → 왜곡된 좌표로 갈지, 반대로 갈지. 우리가 실제로 재는 것은 왜곡된 좌표라서 왜곡된 → 왜곡 없는 쪽이 편할 때가 많습니다. 두 방향은 급수 역변환으로 오갈 수 있고, 어느 쪽을 고르느냐가 최적화할 오차의 좌표계를 정합니다.
  • 접선 왜곡: 방사 방향이 아니라 원을 따라 도는 방향으로 밀리는 성분도 있습니다.
  • 중심 어긋남: 왜곡 중심이 주점과 다르면 위치마다 다른 어긋남이 생깁니다. 작지만 항공 사진처럼 정밀한 경우엔 챙겨야 합니다.
  • 영상면 기울어짐: 센서가 살짝 기울면 배율이 고르지 않고 초점도 흐려집니다. 센서를 다시 맞추기보다 보정용 광학 부품을 하나 끼우는 편이 쉽습니다.

다만 모델이 복잡해질수록 과적합 위험이 커집니다. 자유도가 너무 많으면 보정한 그 장면에서만 맞고 조금만 달라져도 틀리는 모델이 됩니다.

Tsai의 보정법

가장 널리 쓰인 보정법 중 하나입니다. 3D 위치를 정확히 아는 점들이 그려진 보정용 과녁을 찍고, 과녁의 점 \((X_s, Y_s, Z_s)\)와 사진의 점 \((x_I, y_I)\)를 짝지어 씁니다.

미지수는 카메라 내부(초점거리, 주점) 3개에 더해, 과녁에 대한 카메라의 자세(회전 3 + 이동 3, 이것이 외부 방향) 6개까지 모두 9개입니다. 둘을 합친 식은 이렇습니다.

\[\frac{x_I - x_0}{f} = \frac{r_{11}X_s + r_{12}Y_s + r_{13}Z_s + t_x}{r_{31}X_s + r_{32}Y_s + r_{33}Z_s + t_z}, \qquad \frac{y_I - y_0}{f} = \frac{r_{21}X_s + r_{22}Y_s + r_{23}Z_s + t_y}{r_{31}X_s + r_{32}Y_s + r_{33}Z_s + t_z}\]

\(r_{ij}\)는 회전 행렬의 성분, \(t\)는 이동입니다. 분모에 미지수가 있어 비선형입니다. Tsai의 요령은 여기서 시작합니다.

Tsai 보정법의 다섯 단계: 비율 식, 배율 찾기, 직교화, f와 t_z, 비선형 다듬기 앞의 네 단계는 반복 없이 풀리고, 그 결과가 마지막 반복 최적화의 좋은 출발점이 됩니다.

① 두 식을 나눠서 귀찮은 것 지우기

주점을 일단 사진 중심으로 놓고(나중에 다듬음) 두 식을 서로 나누면 분모와 \(f\)가 한꺼번에 사라집니다.

\[\frac{x_I}{y_I} = \frac{r_{11}X_s + r_{12}Y_s + r_{13}Z_s + t_x}{r_{21}X_s + r_{22}Y_s + r_{23}Z_s + t_y}\]

양변에 분모를 곱해 정리하면 미지수에 대해 선형인 식이 됩니다.

\[(X_s y_I)r_{11} + (Y_s y_I)r_{12} + (Z_s y_I)r_{13} + y_I t_x - (X_s x_I)r_{21} - (Y_s x_I)r_{22} - (Z_s x_I)r_{23} - x_I t_y = 0\]

미지수는 8개인데 우변이 0인 동차 방정식이라 전체 크기는 정해지지 않습니다. 그래서 하나(예: \(t_y = 1\))를 고정하고, 대응 점 7개 이상으로 최소제곱을 풉니다.

② 진짜 크기 찾기

고정한 값 때문에 답이 어떤 배수 \(s\)만큼 틀려 있습니다. 회전 행렬의 각 행은 길이가 1이어야 하니

\[s = \frac{1}{\sqrt{r_{11}^2 + r_{12}^2 + r_{13}^2}}\]

둘째 행으로도 똑같이 구해 비교해 보면 좋은 검산이 됩니다. 예를 들어 첫째 행이 \((1.2, 0, 1.6)\), 둘째 행이 \((0.02, 2.0, 0)\)으로 나왔다면 길이가 2.000과 2.0001로 거의 같으니 \(s = 0.5\)로 잘 맞습니다. 둘이 크게 다르면 대응이 잘못됐을 가능성이 큽니다.

③ 두 행을 직각으로 다듬기

잡음 때문에 두 행 \(\mathbf{a}\), \(\mathbf{b}\)가 정확히 수직이 아닐 수 있습니다. 둘을 똑같이 서로 쪽으로 조금 밀어 직각을 만듭니다.

\[\mathbf{a}' = \mathbf{a} + k\mathbf{b}, \quad \mathbf{b}' = \mathbf{b} + k\mathbf{a}, \qquad \mathbf{a}'\cdot\mathbf{b}' = \mathbf{a}\cdot\mathbf{b} + k(\mathbf{a}\cdot\mathbf{a} + \mathbf{b}\cdot\mathbf{b}) + k^2(\mathbf{a}\cdot\mathbf{b}) = 0\]

두 벡터 a, b를 같은 양만큼 서로 쪽으로 밀어 78°에서 90°로 만드는 그림 한쪽만 돌리지 않고 두 벡터를 똑같이 밀어 줍니다. 그래야 어느 행도 편애하지 않습니다.

\(k\)에 대한 2차 방정식이지만 거의 수직일 때는 \(k \approx -\mathbf{a}\cdot\mathbf{b}/2\)로 충분하고, 몇 번 되풀이하면 됩니다. 손으로 계산해 보면 \(\mathbf{a} = (1, 0.06, 0)\), \(\mathbf{b} = (0.02, 1, 0)\)일 때 \(\mathbf{a}\cdot\mathbf{b} = 0.08\)이니 \(k = -0.04\), 그러면 \(\mathbf{a}' = (0.9992, 0.02, 0)\), \(\mathbf{b}' = (-0.02, 0.9976, 0)\)이고 \(\mathbf{a}'\cdot\mathbf{b}' \approx -0.00003\)으로 거의 0이 됩니다. 그다음 길이를 1로 맞추고, 셋째 행은 두 행의 외적으로 얻습니다.

강의는 여기서 2차 방정식의 숫자 함정도 짚습니다. 근의 공식 \(x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}\)에서 \(-b\)와 \(\sqrt{\ }\)가 거의 같은 값이면 빼다가 유효숫자를 잃습니다. 그럴 때는 같은 근을 \(x = \frac{2c}{-b \mp \sqrt{b^2 - 4ac}}\)로 계산합니다.

④ 초점거리와 거리 따로 구하기

이제 회전과 \(t_x\), \(t_y\)를 아니까, 원래 식을 다시 쓰면 남은 \(f\)와 \(t_z\)에 대해 선형입니다.

\[(r_{11}X_s + r_{12}Y_s + r_{13}Z_s + t_x)\,f - x_I\,t_z = (r_{31}X_s + r_{32}Y_s + r_{33}Z_s)\,x_I\]

(\(y\)에 대해서도 같은 꼴) 대응 하나가 식 두 개를 주니 원리적으로 한 점이면 되지만, 여러 점으로 최소제곱을 씁니다.

함정이 하나 있습니다. \(f\)와 \(t_z\)를 가르려면 과녁 안에 깊이 차이가 있어야 합니다. 과녁을 광축에 수직으로, 정면으로 찍으면 \(f\)와 \(t_z\)를 같은 비율로 키워도 사진이 완전히 똑같습니다. 줌을 당기면서 같은 만큼 뒤로 물러나는 영화 기법(돌리 줌)과 같습니다.

정면 과녁에서는 f=1, t_z=4와 f=2, t_z=8의 사진이 완전히 겹치지만, 과녁을 55° 기울이면 원근 차이로 구별되는 비교 정면이면 오직 비율 \(f/t_z\)만 알 수 있습니다. 기울이면 가까운 쪽과 먼 쪽의 크기 차이(원근)가 둘을 갈라 줍니다.

그래서 실제로는 과녁을 비스듬히 놓습니다. 강의에 따르면 자동차 바퀴 정렬 장비도 과녁을 광축에 대해 45~60° 기울여 둡니다.

평면 과녁

과녁이 평면이면(\(Z_s = 0\)) 일이 쉬워집니다. \(r_{13}\), \(r_{23}\), \(r_{33}\)가 식에서 빠져 ① 단계의 미지수가 6개가 되고, 대응 점 5개면 됩니다. 이때 1로 고정하는 미지수가 0에 가까우면 안 됩니다(나눗셈이 폭발하니까). 오래된 센서처럼 가로세로 화소 비율도 구해야 한다면 평면 과녁이 필요합니다.

⑤ 나머지는 반복 최적화

주점과 왜곡 계수는 닫힌 해가 없습니다. 앞 단계의 답을 출발점 삼아 사진 위 오차를 최소화합니다.

\[\min \sum_i \Big[(x_{I,i} - x_{P,i})^2 + (y_{I,i} - y_{P,i})^2\Big]\]

\((x_P, y_P)\)는 현재 추정값으로 예측한 위치입니다. 레벤버그-마쿼트나 가우스-뉴턴으로 풉니다. 회전을 어떻게 나타낼지도 중요합니다. 오일러 각과 깁스 벡터는 특이점이 있고, 단위 사원수는 특이점이 없지만 \(\mathring{q}\cdot\mathring{q} = 1\) 조건을 함께 넣어야 합니다.

잡음에 민감한 곳

  • 과녁이 정면에 가까울수록 \(f\)와 \(t_z\)의 추정이 불안정합니다. 둘이 비율로만 나타나니까요.
  • 높은 차수의 왜곡 계수(\(k_2\) 이상)는 잡음 이득이 큽니다.
  • 이런 민감도는 보통 가우시안 잡음을 넣어 여러 번 돌려 보는 몬테카를로 시뮬레이션으로 확인합니다.

직접 해 보기

① 방사 왜곡. \(k_1\), \(k_2\)를 움직여 술통형과 바늘꽂이형을 만들어 보고, 왜곡 중심을 옆으로 밀어 보세요.

\(k_1 = -0.08\)이면 중심에서 반지름 1(150px) 근처의 다림줄이 약 16px 휘고, 화면 모서리 점은 61px나 안쪽으로 밀립니다. \(k_1\)을 0으로 놓고 \(k_2\)만 바꾸면 중심 부근은 거의 그대로이고 바깥쪽만 휩니다. \(r^4\) 항이라 먼 곳에서만 힘을 쓰기 때문입니다.

② 정면 과녁의 함정. 줌 배율을 바꾸면 \(f\)와 \(t_z\)가 같은 비율로 커집니다. 과녁 기울기가 0°일 때와 기울였을 때를 비교해 보세요.

기울기 0°에서는 줌을 아무리 바꿔도 두 사진의 차이가 0.00px입니다. 20°만 기울여도 줌 배율 1.8에서 차이가 약 1.9px, 45°면 3.7px로 벌어져 \(f\)와 \(t_z\)를 따로 구할 수 있게 됩니다.

정리

  • 위험한 곡면은 2차 곡면이고, 현실에서는 평면 두 장의 교차가 흔합니다. 넓은 시야가 도움이 됩니다.
  • 내부 방향은 초점거리, 주점, 방사 왜곡 계수를 찾는 카메라 보정입니다. 다림줄로 왜곡을 볼 수 있습니다.
  • Tsai 보정법: 두 식을 나눠 \(f\)와 \(t_z\)를 지우고 선형으로 풀고, 행 길이로 배율을 맞추고, 직교화한 뒤, \(f\)와 \(t_z\)를 선형으로, 나머지는 반복 최적화로 구합니다.
  • 과녁을 정면으로만 찍으면 \(f\)와 \(t_z\)를 구별할 수 없으니 기울여서 찍습니다.

참고: 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 라이센스를 따릅니다.