일반적으로 볼록렌즈를 많이 사용한다. 오목렌즈, 직각렌즈에 따라서도 왜곡이 다른 양상으로 발생할 수 있다.
왜곡은 렌즈 형상이 곡률을 가지는 구면 형태이기 때문에 발생한다.
따라서 이미지 중심부 (정확히는 주점, Principal Point) 에서 멀어질수록 표현의 비율이 달라지기 때문에 발생한다.
Barrel Distortion: 중심부가 외각부보다 큰 형태로 발생
Pincushion Distortion: 중심부가 외각부보다 작은 형태로 발생
방사 왜곡은 이미지의 중심으로부터 멀어질수록 왜곡의 정도가 심해진다. (앞선 이미지의 D(%)를 계산하여 확인 가능)
원근 왜곡(Perspective Distortion)이 있다.
방사 왜곡과 접선 왜곡이 광학의 원리와 카메라에서 발생하는 왜곡이라면, 원근 왜곡은 3차원 공간이 2차원 공간으로 투영되면서 발생하는 왜곡이다.
이미지는 공간의 깊이 정보가 하나의 평면으로 투영되는 데이터이기 때문에, 원근감이 손실이 되면 이를 회복할 방법이 없고, 이미지를 촬영하는 환경에 따라 다양한 왜곡이 만들어질 수도, 만들 수도 있다.
다수의 카메라를 사용하는 방법
2장 이상의 이미지를 사용하는 방법
Extrinsic Calibration은 왜곡 모델에 불필요하니 Extrinsic 영향이 없다고 가정하면 행렬은 Identity Matrix가 된다.
Normalized Image Plane에 투영된다고 하면 Intrinsic Matrix를 연산할 필요가 없다.
따라서, 이 된다. 이를 정리하면,
, 여기서 는 undistort의 약자이다.
Undistort에 Distortion 모델을 적용하면 다음과 같다:
(첫번째 괄호식: Radial Distortion, 두번째 행렬식: Tangential Distortion)
여기서, 이 된다.
Normalized Image Plane을 Image Plane으로 변환하면,
앞서 계산한 두 수식을 거꾸로 계산하면 가능하다.
Image Plane에 투영한 Normalized Image Plane의 계산 식을 역으로 계산하면 값을 얻게 된다.
이 를 distortion 수식에 대입하고, 이미지 캘리브레이션으로 나온 를 대입해서 를 구하면 된다.
사실상 OpenCV::undistort
혹은 initUndistortRectifyMap + remap
함수를 사용하면 된다.