Contents — find the section you need
Visual SLAM, Visual Odometry, 에피폴라 기하학, 그리고 PnP는 모두 픽셀 좌표를 3D 공간으로 정확하게 매핑한다는 전제를 깔고 있습니다. 하지만 렌즈를 통과하는 빛은 교과서에서 묘사하는 이상적인 핀홀처럼 상을 형성하지 않습니다. 초점 거리는 픽셀 단위로 얼마일까요? 주점은 이미지 중심에서 얼마나 떨어져 있을까요? 직선은 이미지에서 얼마나 휘어질까요? 카메라 캘리브레이션은 이러한 값들을 수치적으로 계산하는 과정입니다. 캘리브레이션을 소홀히 하면 아무리 정교한 SLAM이나 SfM 알고리즘을 사용하더라도 근본적인 시스템 오류가 전파될 수밖에 없습니다.
0. 30초 요약
-
카메라 캘리브레이션은 3D 점과 이미지 점 사이의 알려진 대응 관계를 이용하여 내부 파라미터(초점 거리, 주점, 왜곡) 및 왜곡 계수를 추정하는 과정입니다. 외부 파라미터(각 촬영 시 카메라 포즈)도 동시에 복원됩니다.
-
렌즈는 방사형 및 접선형 기하학적 왜곡을 모두 가지고 있습니다. 표준 표현 방식은 방사형 왜곡을 k_1,k_2,k_3, 접선형 왜곡을 p_1,p_2로 나타내는 브라운-콘래디 모델입니다. 광각 렌즈와 어안 렌즈는 다른 모델을 사용합니다.
-
Zhang의 방법은 평면 패턴(예: 체커보드)을 여러 포즈에서 촬영하고, 각 시점의 호모그래피에서 내부 파라미터를 선형적으로 계산한 다음, 비선형 최적화를 통해 왜곡을 포함하여 정밀하게 보정하는 방식으로, 실제 사용되는 표준 캘리브레이션 방법입니다.
-
캘리브레이션 품질은 재투영 오차로 평가됩니다. 평균값만 보는 것으로는 충분하지 않습니다. 이미지 내 오차의 공간적 분포와 포즈별 분산도 확인해야 합니다. 그렇지 않으면 완전히 포착되지 않은 국부적인 왜곡을 놓칠 수 있습니다.
- 보정값은 한 번 찾으면 영원히 유효한 상수가 아닙니다. 확대/축소, 초점, 온도, 충격, 해상도 또는 크롭 변경 등은 모두 내재적 매개변수를 변경할 수 있습니다. 이러한 가정이 깨지면 하위 단계의 Visual SLAM, VO 및 PnP 성능이 조용히 저하됩니다.
1. 좌표계를 이용한 핀홀 모델 재검토
세계 좌표계 점 \mathbf{X}=(X,Y,Z,1)^\mathsf{T} (동차 좌표계)는 핀홀 모델에서 이미지에 비례하여 투영됩니다.
R\in SO(3)와 \mathbf{t}는 세계 좌표계에서 카메라 좌표계로의 회전 및 변환(외부 매개변수)이고, K는 내부 행렬입니다.
여기서 f_x,f_y은 픽셀 단위의 초점 거리이고, (c_x,c_y)는 주점(광축이 이미지 평면과 교차하는 지점)이며, s은 왜곡도(대부분의 최신 센서에서는 거의 0에 가까움)입니다. 교정은 관측 데이터만을 이용하여 왜곡 계수인 K과 각 샷의 R,\mathbf{t}을 복원하는 역문제입니다.
다이어그램에서 볼 수 있듯이, 단 한 번의 촬영으로는 내재적 매개변수와 외재적 매개변수를 구분할 수 없습니다. 여러 포즈(기울기, 거리)에서 여러 번 관측값을 수집해야만 K를 거의 고유하게 특정할 수 있습니다. 이것이 바로 다음에 설명할 Zhang의 방법의 핵심 아이디어입니다.
2. 렌즈는 이상적인 핀홀이 아닙니다: 왜곡 모델
실제 렌즈에는 방사형 왜곡이 있습니다. 그리고 접선 왜곡. 정규화된 이미지 좌표를 (x,y)=(X_c/Z_c,\,Y_c/Z_c)로, 반경을 r^2=x^2+y^2로 나타내면, 브라운-콘래디 왜곡 모델은 다음과 같이 표현할 수 있습니다.
k_1,k_2,k_3는 방사 왜곡 계수이고, p_1,p_2는 접선 왜곡 계수입니다. 방사 왜곡은 렌즈 중심에서 멀어질수록 이미지가 수축하거나 볼록해지는 현상으로, 광각 렌즈에서 보이는 뚜렷한 "배럴" 왜곡이나 망원 렌즈에서 보이는 "핀쿠션" 왜곡으로 나타납니다. 접선 왜곡은 렌즈 그룹과 이미지 센서가 완벽하게 평행하지 않은 구현상의 결함으로 인해 발생하는 작고 비대칭적인 요소입니다. 최종 픽셀 좌표는 \tilde{\mathbf{x}}_{px}=K(x_d,y_d,1)^\mathsf{T}로 얻을 수 있습니다.
어안 렌즈처럼 시야각이 매우 넓은 렌즈의 경우, 브라운-콘래디 다항식 모델은 가장자리 부근에서 발산하는 경향이 있어 실용적이지 않습니다. 대신 OpenCV의 어안 모델처럼 각도 기반 등거리 투영 근사법을 사용하는 것이 일반적입니다. "하나의 왜곡 모델을 암기"하기보다는 렌즈의 시야각과 광학 설계에 따라 모델을 선택하는 것이 중요합니다.
3. Zhang의 방법: 평면 패턴을 이용한 캘리브레이션
오늘날 가장 널리 사용되는 방법은 Zhengyou Zhang이 2000년에 발표한 평면 패턴 캘리브레이션 방법입니다. 특별한 3D 캘리브레이션 장비는 필요하지 않습니다. 인쇄된 체커보드와 같은 평면 패턴을 여러 각도에서 촬영하고, 카메라 또는 패턴 자체를 움직여 촬영하기만 하면 됩니다.
패턴 평면(Z=0)에서 특정 각도(i)로의 매핑은 회전 행렬의 첫 번째와 두 번째 열(\mathbf{r}_1,\mathbf{r}_2)과 변환(\mathbf{t})을 사용하여 호모그래피로 표현할 수 있습니다.
여기서 각 포즈의 H_i은 패턴의 알려진 그리드 포인트와 해당 이미지 대응점을 사용하여 호모그래피 입문서에 설명된 DLT 방법을 통해 선형적으로 추정할 수 있습니다. 회전 행렬의 열이 정규 직교한다는 제약 조건(\mathbf{r}_1^\mathsf{T}\mathbf{r}_2=0,\ \|\mathbf{r}_1\|=\|\mathbf{r}_2\|)을 사용하면 B=K^{-\mathsf{T}}K^{-1}에 대한 선형 방정식이 얻어집니다.
이 방정식은 포즈당 두 개의 방정식을 제공합니다(\mathbf{h}_1,\mathbf{h}_2는 H_i의 첫 번째 및 두 번째 열입니다). B는 6자유도를 갖는 대칭 행렬이므로, 3개 이상의 포즈가 주어지면 선형 최소 제곱법을 통해 B를 구할 수 있고, 그 후 촐레스키 분해와 유사한 절차를 통해 K를 폐쇄형 해법으로 구할 수 있습니다. 이것이 바로 Zhang의 방법이 "평면의 몇 장의 사진"만 필요로 하는 이유입니다. 그러나 모든 포즈가 이미지 평면에 거의 평행한 경우(정면 평행), 방정식이 퇴화되므로 여러 각도로 기울어진 포즈가 필요합니다.
폐쇄형 해법은 왜곡을 무시한 초기값일 뿐입니다. 여기서부터 실제 표준 2단계 접근 방식은 다음 절에서 설명하는 재투영 오차를 목적 함수로 사용하여 비선형 최적화(일반적으로 Levenberg-Marquardt)를 통해 왜곡 계수를 포함한 모든 매개변수를 정밀하게 조정합니다.
4. 재투영 오차 및 파라미터 최적화
캘리브레이션의 목적은 모든 포즈와 모든 그리드 포인트에 대해 관측된 픽셀과 추정된 파라미터로 계산된 투영 위치 간의 차이를 최소화하는 것입니다. 포즈 i, 포인트 j에서의 관측값을 \mathbf{u}_{ij}로, 평면상의 해당 알려진 3D 포인트를 \mathbf{X}_j로 나타내면,
이것이 최소화되는 값입니다. \boldsymbol{\kappa}=(k_1,k_2,k_3,p_1,p_2)는 왜곡 계수 벡터이고, \pi_d은 왜곡을 포함하는 투영 함수입니다. 미지수는 K(자유도 4~5개), \boldsymbol{\kappa}(자유도 3~5개), 그리고 포즈당 R_i,\mathbf{t}_i(자유도 6개 × 포즈 개수)으로 크지만, 관측점이 충분하면 문제는 잘 제약됩니다. 이 공식은 번들 조정 입문에서 다룬 "카메라 포즈와 3D 구조를 공동으로 최적화"하는 프레임워크의 특수한 경우로 볼 수 있습니다. 3D 포인트 좌표는 보정 과정에서 알려져 있고 고정되어 있기 때문에 일반적인 번들 조정보다 더 쉬운 하위 문제입니다.
재투영 오차 \left\|\mathbf{u}_{ij}-\hat{\mathbf{u}}_{ij}\right\|의 제곱평균제곱근(RMS) 값을 "보정 정확도"로 보고하는 것이 일반적이지만, 평균값만 보고 보정이 완료되었다고 단정하는 것은 위험합니다. 다음 사항도 항상 확인하십시오.
- 각 포즈의 평균 오차에 분산이 있는지 여부 (특정 각도에서 오차가 특히 큰 포즈는 패턴 왜곡, 모션 블러 또는 불균일한 조명을 나타낼 수 있습니다.)
- 이미지 내 오차의 공간 분포 (가장자리에 체계적인 오차가 남아 있는 경우 왜곡 모델의 차수 또는 유형이 불충분할 수 있습니다.)
- 그리드 포인트 검출의 서브픽셀 정확도 (코너 검출 자체가 불안정한 경우, 아무리 최적화를 해도 모델 오차와 구분할 수 없습니다.)
5. OpenCV 구현 골격
일반적인 단일 카메라 캘리브레이션 절차는 다음과 같습니다. 촬영 조건(해상도, 줌, 초점)을 고정하고 이미지의 네 모서리, 중앙 및 여러 각도에서 패턴을 촬영하면 좋은 캘리브레이션의 90%를 달성할 수 있습니다.
import cv2 as cv
import numpy as np
pattern_size = (9, 6) # number of internal corners
objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
objp *= square_size_m # measured side length of one square [m]
obj_points, img_points = [], []
for gray in calibration_images: # multiple frames shot at different poses
found, corners = cv.findChessboardCorners(gray, pattern_size)
if found:
corners = cv.cornerSubPix(gray, corners, (11, 11), (-1, -1),
(cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001))
obj_points.append(objp)
img_points.append(corners)
ret, K, dist, rvecs, tvecs = cv.calibrateCamera(
obj_points, img_points, gray.shape[::-1], None, None)
# ret is the RMS reprojection error [px]. Also compute per-pose error separately to check.
광각 렌즈 또는 어안 렌즈의 경우 일반적인 calibrateCamera API 대신 cv.fisheye.calibrate 계열 API를 사용하십시오. 스테레오 리그의 경우, cv.stereoCalibrate을 사용하여 두 카메라의 내부 파라미터 외에도 상대적인 포즈를 찾고, cv.stereoRectify을 사용하여 좌우 이미지를 수평 에피폴라 라인에 정렬합니다. 이 절차는 스테레오 카메라 작동 방식 및 심도 카메라 작동 방식에서 다룬 기본 설계와 직접 연결됩니다.
6. 보정 드리프트가 하위 시스템을 손상시키는 이유
Visual SLAM, VO 및 PnP의 많은 수학 공식은 촬영 조건이 변경되지 않는 한 보정 값이 일정하게 유지된다는 가정 하에 작성되었습니다. 에피폴라 기하학 입문의 필수 행렬 추정은 정규화된 좌표 K^{-1}\tilde{\mathbf{x}}을 가정합니다. PnP 입문에 설명된 재투영 오차 최소화 과정에서도 K 값을 알려진 값으로 취급합니다. 만약 K 값이나 왜곡 계수가 실제 광학 시스템과 일치하지 않으면, 이러한 모든 계산은 사실상 "잘못된 기준"으로 수행되는 것과 같습니다.
구체적으로, 보정 값은 다음과 같은 이유로 인해 조용히 저하됩니다.
-
줌/초점 변화: 초점 거리가 변하는 렌즈를 사용할 경우, f_x,f_y 값은 촬영할 때마다 달라집니다. 자동 초점 기능을 사용하면 보정 시점과 실제 촬영 시점의 내부 매개변수가 일치하지 않게 됩니다.
-
온도 및 기계적 충격: 렌즈 배럴이나 센서 마운팅 위치가 조금만 변해도 주점과 왜곡 계수가 이동합니다. 이는 특히 야외, 자동차, 드론 촬영과 같은 응용 분야에서 무시할 수 없는 문제입니다.
-
해상도 변경, 자르기 또는 디지털 줌: K은 픽셀 단위 매개변수이므로 이미지 크기가 조정되거나 잘리면 f_x,f_y,c_x,c_y도 크기에 따라 업데이트해야 합니다. 이를 잊어버리는 것은 매우 흔한 오류입니다.
-
좌/우 카메라 리그의 변형: 스테레오 설정에서 내부 매개변수뿐만 아니라 상대적인 자세(외부 보정)가 시간이 지남에 따라 약간이라도 변하면 시차로부터 계산된 깊이에 체계적인 오류가 발생합니다.
이러한 오류는 단일 자세 추정에서는 알아차리기 어렵습니다. 하지만 VO나 SLAM처럼 시간에 따라 포즈를 순차적으로 통합하는 시스템에서는 체계적인 재투영 오류가 드리프트로 누적되어 루프 클로저로도 완전히 보정할 수 없는 왜곡된 지도가 생성됩니다. 실제 운영 시스템에서는 고정된 알려진 3D 특징(건물의 직선, 크기가 알려진 표지판 등)을 사용하여 온라인으로 보정 드리프트를 모니터링하거나 주기적인 재보정 루틴을 구축하는 것이 좋습니다.
7. 일반적인 오류 및 대책
| 오류 패턴 | 발생 원인 | 대책 |
|---|---|---|
| 포즈 다양성 부족(정면 촬영만 사용) | 특히 k_3 및 주점의 왜곡이 제대로 측정되지 않음 | 이미지의 네 모서리, 중앙, 그리고 여러 가지 기울기 각도에서 촬영 |
| 평면에서 왜곡된 패턴 | 보정의 기본 전제가 무너져 체계적인 오류가 전체에 퍼짐 | 단단한 평면 패널에 장착하고 물리적 측정을 통해 인쇄 크기 오류를 수정 |
| 모서리 감지 정확도가 낮음 | 모델의 표현력과 관계없이 재투영 오류의 최소값이 높아짐 | 서브픽셀 보정, 충분한 해상도, 초점 및 노출 관리 |
| 광각 렌즈에 일반적인 핀홀 왜곡 모델 적용 | 이미지 가장자리에서 발산하는 오류, 불안정한 최적화 | 어안 렌즈 모델과 같이 시야각에 맞는 모델 선택 |
| 크기 조정/자르기 후 K 업데이트 안 함 | 주점과 초점 거리가 스케일과 동기화되지 않아 자세 추정에 체계적인 오류 발생 | 모든 이미지 변환 시 K를 해당 스케일로 변환 |
| 롤링 셔터 무시 | 실제 투영 중심은 단일 프레임 내에서도 행마다 다릅니다. | 글로벌 셔터를 채택하거나 행 타이밍 모델로 보정하십시오. |
8. 요약
카메라 캘리브레이션은 이미지를 "단순한 2차원 배열"에서 "기하학적으로 해석 가능한 관측값"으로 변환하는 첫 번째 단계입니다. 핀홀 모델의 내재적 및 외재적 매개변수와 방사형 및 접선 왜곡 계수는 Zhang의 평면 패턴 방식처럼 여러 포즈에서의 관측값을 통해 복구되며, 재투영 오차의 비선형 최적화를 통해 최종적으로 결정됩니다. 이 캘리브레이션의 품질은 특정 알고리즘의 정확도 지표에는 나타나지 않지만, 에피폴라 기하학, PnP, 비주얼 SLAM, SfM, 번들 조정 등 모든 후속 단계의 모든 방정식의 기본 전제가 됩니다. 캘리브레이션은 일회성 작업이 아니라 촬영 조건 변화에 따라 지속적으로 모니터링해야 하는 파이프라인의 일부입니다.
보정 이미지 하나에 작은 오류가 있어도 충분할까요?
해당 관점이 더 적합할 수 있습니다.
다양한 기울기, 이미지 가장자리 및 별도의 검증 이미지를 확인하십시오.참고 문헌
- Zhang, A Flexible New Technique for Camera Calibration (IEEE TPAMI, 2000)
- Heikkilä & Silvén, A Four-step Camera Calibration Procedure with Implicit Image Correction (CVPR 1997)
- Hartley & Zisserman, Multiple View Geometry in Computer Vision (저자 공식 페이지)
- OpenCV — Camera Calibration and 3D Reconstruction
- OpenCV — Camera Calibration tutorial
- OpenCV — fisheye calibration module
- Kalibr (카메라/IMU 캘리브레이션 도구, 공식 저장소)
댓글
먼저 로그인해 주세요.
아직 데이터가 없습니다.