4.1 핀홀 카메라와 좌표 프레임
4.1.1 투영 모델
카메라 좌표의 점 에서 라 하자. 왜곡이 없는 핀홀 카메라에서 정규화 좌표는
이고, 픽셀 좌표는
이다. 는 픽셀 단위 초점거리, 는 주점(principal point), 는 skew다. 현대 카메라에서는 보통 으로 모델링한다.
월드 점 를 카메라로 옮기는 외부 파라미터가 라면
이다. 표기 는 “프레임 의 좌표를 프레임 로 표현한다”는 뜻으로 이 책 전체에서 사용한다.
내부 파라미터는 카메라 내부 광학·센서 특성을, 외부 파라미터는 카메라가 로봇/세계 어디에 놓였는지를 나타낸다. 해상도나 crop을 바꾸면 도 함께 변할 수 있지만, 카메라가 움직였다고 가 바뀌는 것은 아니다.
이해 도움말 — 내부 파라미터와 외부 파라미터를 구분하는 질문
“이 카메라가 픽셀을 어떤 광선으로 해석하는가?”에 답하는 것이 내부 파라미터(intrinsic parameter) 이고, “그 광선이 로봇이나 월드에서 어느 방향을 향하는가?”에 답하는 것이 외부 파라미터(extrinsic parameter) 다. 렌즈·해상도·crop이 바뀌면 먼저 를 의심하고, 카메라 마운트를 다시 조립했거나 충격을 받았다면 를 다시 측정한다.
4.1.2 렌즈 왜곡
실물 렌즈는 핀홀 모델에서 벗어난다. OpenCV의 일반적인 모델은 방사 왜곡 과 접선 왜곡 를 사용한다. 정규화 좌표에서 라 할 때 대표적인 형태는
이다. 정확한 모델과 계수 순서는 사용하는 OpenCV calibration model을 기록한다. 시뮬레이터가 왜곡 없는 영상을 생성해도, 실물 전환 시 동일한 전처리를 만들기 위해 시뮬레이션 영상에 보정 전 왜곡을 합성하거나 실물 영상을 rectify할 수 있다.
4.1.3 역투영과 깊이의 의미
픽셀 와 optical-axis depth 가 주어지면
로 복원한다. 그러나 센서의 depth가 광축 방향 인지, 카메라 중심에서 점까지의 Euclidean range인지 확인해야 한다. 둘은 화면 가장자리에서 다르다.
code/camera_geometry.py는 투영, 역투영, 좌표 변환을 NumPy로 구현한다. 행렬의 방향과 depth 정의를 함수 이름과 docstring에 명시했다.
4.1.4 캘리브레이션 품질
캘리브레이션의 단일 RMS reprojection error만 보고 품질을 판단하지 않는다.
- 패턴이 화면 전체와 다양한 자세를 덮는가?
- 학습과 검증 이미지가 분리되어 있는가?
- 잔차가 특정 모서리나 방향에 편향되는가?
- 초점·노출·해상도가 운영 조건과 같은가?
- 외부 파라미터는 카메라 마운트 재조립 뒤 다시 측정했는가?
Eye-in-hand 카메라는 base_link -> tool0 -> camera_link 체인에 있고, eye-to-hand 카메라는 보통 world 또는 base_link에 고정된다. 두 경우의 외부 파라미터가 업데이트되는 방식이 다르다.