세상은 3차원인데 카메라나 우리 눈은 2차원 평면으로 보이게 만든다.
카메라 움직일 때 화면이 달라지는 이유는 Camera Extrinsics가 변하기 때문이다.
zoom in/out 할 때 화면이 달라지는 이유는 Camera Intrinsics가 변하기 때문이다.
오이현상이 발생하는 이유는 Camera Distortion이 존재하기 때문이다.
→ Camera Extrinsics, Intrinsics, Distortion 정보를 모두 알고 있다면 카메라가 세상을 2차원으로 만드는 것을 그대로 구현할 수 있다.
→ 3가지 정보를 잘 조작하여 원하는 방식대로 3차원 세상을 2차원으로 만드는 것이 가능하다.

STEP 1. 월드 좌표계 설정
3차원 세상에서 임의의 점을 잡고 원점으로 설정하면, 모든 물체의 위치를 좌표로 나타낼 수 있다.
임의로 원점을 잡는 것을 월드 좌표계를 설정한다고 한다.
STEP 2. 월드 좌표계의 위치좌표를 카메라 좌표계의 위치좌표로 변환
화면에 세상을 담기 위해서는 우선 카메라가 세상을 어떤 시야로 보고 있는지 알아야 한다.
카메라의 시야에서 세상을 바라보고 있으므로, 월드 좌표계를 카메라 좌표계로 변환한다.
월드 좌표계 기준의 위치좌표에 Camera Extrinsics 행렬을 곱하면 카메라 좌표계 기준의 위치좌표로 변환된다.
즉, Camera Extrinsics는 카메라의 위치 및 바라보는 방향 등의 카메라의 외부 정보를 담고 있다.
Step 3. 카메라 좌표계의 위치좌표를 픽셀 좌표계의 위치좌표로 변환
카메라의 위치가 고정돼 있어도 카메라 내부의 설정에 따라 보이는 것이 달라진다.
카메라 좌표계에 Camera Intrinsics 행렬을 곱하면 픽셀 좌표계로 변환된다.
즉, Camera Intrinsics는 카메라의 초점거리, 주점의 위치 등 카메라 내부 정보를 담고 있다.
→ 이 과정들을 통해 3차원 세상(월드 좌표계의 위치좌표)이 2차원 화면(픽셀좌표계의 위치좌표)으로 매핑된다.
1. Camera Extrinsics
Camera Extrinsics는 2가지 정보, 카메라가 바라보는 방향과 카메라의 위치를 가지고 있는 행렬이다.
계산의 편의성을 위해 homogeneous coordinate를 활용한다.
은 카메라의 회전 정보(x, y, z축)를 모두 담고 있는 행렬이다.
t\in \mathbb{R}^{3\times1}는 카메라의 위치 정보를 담고 있는 행렬이다.
Homogeneous Coordinate란?
(x, y)를 (x, y, 1)로 표현하는 것이다.
Homogeneous 좌표계를 사용하면 Affine 변환이나 perspective(projective) 변환을 하나의 행렬로 표현할 수 있다.
Affine 변환은 회전, 평행이동, 스케일 뿐만 아니라 shearing, 반전(reflection)까지를 포함한 변환이다.
<Affine Transformation을 homogeneous coordinate을 사용하지 않은 경우>
<Affine Transformation을 homogeneous coordinate을 사용한 경우>
장점은..
- 복합 변환의 효율성과 일관성을 높임 → 미리 곱해 하나의 행렬로 변환해놓기 가능
- 코드의 간결성과 유지보수성을 개선함 → 코드 짧아짐
- GPU 가속을 통한 계산 효율성 향상에도 기여함 → 행렬곱만으로 변환을 구성하기 때문
2. Camera Intrinsics
Camera Intrinsics는 3가지 정보, 초점거리, 주점의 위치, 비대칭 계수를 가지고 있는 행렬이다.
: x축 초점거리
: y축 초점거리
: 주점의 위치
: 비대칭 계수
3. Camera Distortion
렌즈 특성상 발생하는 이미지의 왜곡이다.
Radial Distortion, Tangential Distortion이 있다.
1. Radial Distortion (방사 왜곡)
이미지의 중심에서 멀어질수록 커지는 왜곡으로, 넓은 시야를 가진 광각 렌즈에서 특히 두드러진다.
: 왜곡 전 좌표
: 왜곡된 좌표
는 방사 왜곡 계수로, 각각 2차, 4차, 6차 방사왜곡을 설명한다. 보통 과 만 사용하며, 는 무시되기도 한다.
2. Tangential Distortion (접선 왜곡)
렌즈와 이미지 센서가 완전히 평행하지 않을 때 발생하는 왜곡이다.
왜곡 계수란 . . ?
카메라 왜곡을 보정하기 위해 왜곡 계수 d를 다음과 같이 정의한다.
OpenCV와 같은 카메라 보정 라이브러리에서 사용되며, camera calibration 과정에서 얻어진 값을 통해 방사 및 접선 왜곡을 보정할 수 있다.
카메라의 외부 파라미터(Camera Extrinsics)와 내부 파라미터(Camera Intrinsics)를 정확히 계산하는 것이다.
3D 공간에 있는 물체의 좌표와 이를 촬영한 이미지 상의 2D 좌표를 이용한다.
3차원 세상이 2차원 평면(이미지 센서)에 어떻게 매핑되고 있는지 확인하기 위해 필요하다.
2D 좌표만으로 3D 깊이를 파악할 수 있다.
자율주행에서 매순간 Camera Extrinsics와 Camera Intrinsics가 달라지게 된다.
준비물: 체커보드, 카메라, OpenCV
체커보드를 사용하는 이유는 3D 좌표를 설정하기 편하고 2D 좌표 인식의 정확성 때문이다.
체커보드의 특징
Gradient Change
교차점 구조의 규칙성
특이한 패턴으로 인해 잘못 탐지할 가능성 감소
Calibration 진행 방법
최소제곱법 (Levenberg-Marquardt 알고리즘 등) 활용하여 파라미터를 초기화한 후 점차적으로 개선한다.
Calibration은 최소제곱법을 사용하여 최소화된 오차를 찾는 방식으로 진행된다.
: 카메라의 내부 파라미터를 이용해 3D 좌표를 2D 이미지로 투영한 값
: 실제 이미지에서 추출한 2D 점
성호오빠 1주차 과제..