Konsla Hobby
konsla99 님의 블로그 입니다.
Category
카메라 캘리브레이션 (Camera Calibration) 이론)
개요
- cv::calibrateCamera()를 사용한 계산방식, 이미지 왜곡 수정 방식에 대해 알아본다.
필요한 체스판 코너의 수
캘리브레이션을 통해 해결하려는 파라미터
OpenCV의 경우 카메라 내장 행렬 - $f_x, f_y,c_x, c_y$ 4개 왜곡 파라미터 - $k_1, k_2, k_3, p_1, p_2$ (5개, $k_3~$는 조건부)
코너 N개와 K개의 이미지가 각기 다른 위치에서 촬영됐다고 가정
- $2 \cdot N \cdot K$ 의 제약 조건을 갖는다. (x,y좌표에 대해 2)
- 왜곡 파라미터를 무시해도 10개의 내,외부 파라미터가 존재
- $2 \cdot N \cdot K \geq 6 \cdot K+4$ or $K(N-3)\geq 2$
즉 이론적으로 3X3의 체스보드 이미지 2장이 있다면 캘리브레이션을 수행할 수 있다. 하지만 실제로는 7X8이상의 사이즈로 10장 이상(다양한 위치에서 촬영된)이 필요하다. 이는 노이즈와 수치의 안정성을 위해 필수적이다. (내부 파라미터는 작은 노이즈에서 높은 민감도를 가짐)
캘리브레이션 함수의 내부 구조




캘리브레이션용 함수
이미지에서 코너를 찾으면 cv::calibrateCamera()를 호출할 수 있다. 이를 통해 카메라 내부 행렬, 왜곡 계수, 회전 벡터, 평행 이동 벡터를 얻을 수 있다.
카메라 캘리브레이션 루틴
calibrateCamera();
double cv::calibrateCamera(
cv::InputArrayOfArrays objectPoints,//K개 벡터(N개의 점, 대상의 좌표)
cv::InputArrayOfArrays imagePoints, //K개 벡터(N개의 점, 이미지의 좌표)
cv::Size imageSize, // 픽셀단위 이미지 크기
cv::InputOutputArray cameraMatrix, // 3x3카메라 내부 파라미터
cv::InputOutputArray distCoeffs, // 왜곡 계수4,5 or 8개
cv::OutputArrayOfArrays rvecs, // 회전 벡터
cv::OutputArrayOfArrays tvecs, // 평행이동 벡터
int flags = 0,
cv::TermCriteria criteria = TermCriteria(
TermCriteria::COUNT + TermCriteria::EPS,
30, //반복횟수
DBL_EPSILON // 총 재투영오차
)
)
- objectPoint 정의에 따라 tvecs와 같은 출력에 영향을 준다.
- 정의된 스케일에 맞춰 동일한 단위로 출력값이 결정된다.
점진적으로 파라미터 튜닝하는 경우 특정 파라미터를 고정시키고 다른 파라미터를 계산하는 방법이 있다. flags를 통해 이런 방식을 제어할 수 있다.
- 초기값 관련
- CALIB_USE_INTRINSIC_GUESS: cameraMatrix 초기값 사용
- $c_x, c_y$는 특히 imageSize에서 직접 가져온다
- 내부 파라미터 고정
- CALIB_FIX_PRINCIPAL_POINT: 주점(cx, cy) 고정
- 1과 사용하면 제공된 값
- 단독 사용시 중앙 고정
- CALIB_FIX_ASPECT_RATIO: fx/fy 비율 고정
- CALIB_FIX_FOCAL_LENGTH: fx, fy 모두 고정
- CALIB_ZERO_TANGENT_DIST: 접선 왜곡 p1=p2=0으로 고정
- 왜곡 계수 고정
- CALIB_FIX_K1: k1 고정
- 왜곡 모델 선택
- CALIB_RATIONAL_MODEL: k4, k5, k6 포함 (8개 왜곡 계수)
solvePnP();
- 이미 내부 파라미터를 가지고 있는 경우 대상의 위치만 계산하면된다.
- N개의 점에 대한 원근법
- 내부파라미터는 input으로만 주어짐
bool cv::solvePnP(
InputArray objectPoints,
InputArray imagePoints,
InputArray cameraMatrix,
InputArray distCoeffs,
OutputArray rvec,
OutputArray tvec,
bool useExtrinsicGuess = false,
int flags = SOLVEPNP_ITERATIVE
)
solvePnPRansca()
solvePnP 가 이상치에 견고하지 않은 문제가 존재한다. 체스판같은 이미지가아닌 이상치에서는 해당 방식이 효과적이다.
반응형
'Computer Vision > 캘리브레이션' 카테고리의 다른 글
| 카메라 캘리브레이션 - 왜곡 제거 (0) | 2026.03.15 |
|---|---|
| 카메라 모델과 캘리브레이션 -캘리브레이션 (0) | 2025.10.22 |
| 카메라 모델과 캘리브레이션-카메라모델 (1) | 2025.10.21 |
| 카메라 캘리브레이션 (Camera Calibration) 이론 (0) | 2025.10.19 |
END