Konsla Hobby
konsla99 님의 블로그 입니다.
Category
카메라 캘리브레이션 (Camera Calibration) 이론)
목차
개요
간단한 핀홀 모델에서 렌즈를 사용해 발생하는 주요 오차를 카메라 캘리브레이션을 사용해 수학적으로 수정 하는 방법을 학습한다.
충분한 빛을 모으지 않아 이미지를 만드는 좋은 방법은 아니다. 이러한 이유로 렌즈를 사용하지만 핀홀 모델의 단순한 기하학으로 설명이 어려우며, 렌즈 자체에서 왜곡이 발생하는 문제가 있다.
카메라 캘리브레이션 과정에서 다음 두가지 모델을 얻을 수 있다.
- 카메라의 기하학적 모델
- 렌즈의 왜곡 모델
이 두가지 모델을 통해 카메라의 고유 파라미터를 정의할 수 있다.
호모그래피 변환을 통해 카메라의 기보 동작과 다양한 왜곡 및 수정에 의한 효과를 살펴보고 OpenCV의 cv::calibrateCamera()의 기능에 대해 알아본다.
카메라 모델
핀홀 모델

- 그림과 같이 하나의 바늘 구멍을 통해 외부의 상이 이미지로 투영되는 모델
- 바늘구멍(Pinhole)이 렌즈의 중심
- 뒷면의 상까지의 거리는 카메라 초점거리에 해당

3차원 피사체와 2차원 이미지의 수식관계
h,H를 편의상 x,X로 표기
$$-\frac{x}{f}=\frac{X}{Z}$$
사진에서 핀홀평면과 이미지 평면을 교환하면, 다음과 같다.


- 계산의 편의를 위해 이미지 평면을 헨즈 앞쪽에 위치 시킨다.
- 3차원 피사체 위의 한점을 A, 해당 점이 투영된 이미지 상의 위치를 a라고 정의
- 이모델에서 다음과 같은 수식이 성립한다. $$x = f\frac{X}{Z}$$
- 모든 모델에서 광축과 주점은 일치하도록 되어있다.
- 하지만 이는 어렵기 때문에 새로운 파라미터를 도입한다.
- $c_x , c_y$ 두 매개변수는 영상평면위의 좌표 중심 기반 이동 변위
- 픽셀이 직사각형인 경우를 고려해 두개의 파라미터 도입 $$x_{image} = f_x\frac{X}{Z}c_x , f_x\frac{X}{Z}+c_x$$ $$y_{image} = f_y\frac{Y}{Z}c_y, f_y\frac{Y}{Z}+c_y$$
- 초점 거리 f는 렌즈의 실제 초점거리와 영상 센서 개별 요소크기 s의 곱
- s의 단위는 (픽셀)/(거리단위)
- 실제 초점거리 F는 거리단위를 사용 하기 때문에 f는 픽셀단위
- 카메라 캘리브레이션을 통해서 s, f는 직접 구할 수 없다.
투영 기하학
투영변환 : 3D좌표를 2D좌표에 매핑하는 과정
- 해당 작업에는 동차 좌표 사용을 권장한다.
- n 차원의 좌표는 실제로 n+1차원의 벡터로 표현
- (x,y) ->(x,y,z)
- 이 두점은 동등한 점이라는 제한 사항이 있다.
N차원점을 N+1차원으로 표현하는 것으로 N차원에서는 N+1축의 정보를 가지고 있는다. 즉 동일한 점이다.
$$\vec{q} = \begin{bmatrix} x \\ y \\ w \end{bmatrix}, \quad M = \begin{bmatrix} f_x & s & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}, \quad \vec{Q} = \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}\ $$
$$\vec{q} = M \vec{Q}$$

해당 식을 통해 $y=f\frac{Y}{Z}$임을 알 수 있다. 물체가 멀리 있을 수록 좌표의 절대값이 작아진다.
convertPointsToHomogeneous
// 입력 (N=2)
src = (x, y)
// 출력 (N+1=3)
dst = (x, y, 1)
convertPointsFromHomogeneous
// 입력 (N=3)
src = (u', v', w) // 예: (1320, 2240, 5)
// 처리
w = src[2] = 5
x = src[0] / w = 1320 / 5 = 264
y = src[1] / w = 2240 / 5 = 448
// 출력 (N-1=2)
dst = (264, 448)
로드리게스 변환
- 오일러각은 3개의 축을 회전시킴 이때 Gimbal lock등의 문제 발생
- gimbal lock : 회전시키다 보면 2개의 축이 겹칠 수 있다.
- 회전축이 lock이 걸리는 현상

로드리게스 변환은 회전할 축을 하나 구해서 해당 축을 기준으로 반시계 방향 회전 각도
$$\mathbf{R} = \cos\theta \mathbf{I}_3 + (1-\cos\theta)\mathbf{r}\mathbf{r}^T + \sin\theta \begin{bmatrix} 0 & -r_z & r_y \\ r_z & 0 & -r_x \\ -r_y & r_x & 0 \end{bmatrix}$$ 각 추출 $$[\mathbf{r}]_\times = \frac{\mathbf{R} - \mathbf{R}^T}{2\sin\theta}$$
렌즈에 의한 왜곡
렌즈 왜곡에는 크게 두가지 왜곡이 존재한다.
방사왜곡 (radian distortion)

- 렌즈 모양에 의함(굴절률에 의함)
- 왜곡 정도가 중심에서의 거리에 의해 결정

접선왜곡(tangential distortion)
![]() |
![]() |
|---|---|
- 카메라 조립과정에서 발생
- 렌즈와 이미지 센서의 수평문제

렌즈 왜곡의 수학적 모델
일반적으로 카메라 내부 파라미터의 영향을 제거한 정규화된 이미지 평면에서 정의 $$\begin{bmatrix} x_{n\_u} \\ y_{n\_u} \end{bmatrix} = \begin{bmatrix} X_c / Z_c \\ Y_c / Z_c \end{bmatrix} \qquad (n:nomalized, u:undistorted) $$
$$\begin{bmatrix} x_{n\_d} \\ y_{n\_d} \end{bmatrix} = (1 + k_1 r_u^2 + k_2 r_u^4 + k_3 r_u^6) \begin{bmatrix} x_{n\_u} \\ y_{n\_u} \end{bmatrix} + \begin{bmatrix} 2p_1 x_{n\_u} y_{n\_u} + p_2(r_u^2 + 2x_{n\_u}^2) \\ p_1(r_u^2 + 2y_{n\_u}^2) + 2p_2 x_{n\_u} y_{n\_u} \end{bmatrix}$$
- $k_i$ : 방사 왜곡 계수 ($k_1, k_2$위주 이며 $k_3$는 어안렌즈 같이 왜곡이 심한경우)
- $p_i$ : 접선왜곡 계수
- $r_u$ : 이상적인 반지름
- $r_u^2 = x_{n\_u}^2 + y_{n\_u}^2$ 를 만족한다.
- 왜곡 벡터: $\begin{bmatrix} k_1\\ k_2 \\ p_1 \\ p_2 \\ k_3 \end{bmatrix}$ $k_3$가 마지막에 위치
'Computer Vision > 캘리브레이션' 카테고리의 다른 글
| 카메라 캘리브레이션 - 왜곡 제거 (0) | 2026.03.15 |
|---|---|
| 카메라 캘리브레이션 (0) | 2025.10.23 |
| 카메라 모델과 캘리브레이션 -캘리브레이션 (0) | 2025.10.22 |
| 카메라 캘리브레이션 (Camera Calibration) 이론 (0) | 2025.10.19 |

