4.1 핀홀 카메라와 좌표 프레임

4.1.1 투영 모델

카메라 좌표의 점 Pc=(Xc,Yc,Zc)T\mathbf{P}_c=(X_c,Y_c,Z_c)^T에서 Zc>0Z_c>0라 하자. 왜곡이 없는 핀홀 카메라에서 정규화 좌표는

xn=XcZc,yn=YcZc x_n=\frac{X_c}{Z_c},\qquad y_n=\frac{Y_c}{Z_c}

이고, 픽셀 좌표는

[uv1]=[fxscx0fycy001]⏟K[xnyn1] \begin{bmatrix}u\\v\\1\end{bmatrix} = \underbrace{\begin{bmatrix} f_x&s&c_x\\0&f_y&c_y\\0&0&1 \end{bmatrix}}_{K} \begin{bmatrix}x_n\\y_n\\1\end{bmatrix}

이다. fx,fyf_x,f_y는 픽셀 단위 초점거리, (cx,cy)(c_x,c_y)는 주점(principal point), ss는 skew다. 현대 카메라에서는 보통 s=0s=0으로 모델링한다.

월드 점 Pw\mathbf{P}_w를 카메라로 옮기는 외부 파라미터가 cTw{}^{c}T_w라면

P~c=cTwP~w,cTw=[cRwctw01] \tilde{\mathbf{P}}_c = {}^{c}T_w\tilde{\mathbf{P}}_w, \qquad {}^{c}T_w= \begin{bmatrix}{}^{c}R_w&{}^{c}\mathbf{t}_w\\0&1\end{bmatrix}

이다. 표기 aTb{}^{a}T_b는 “프레임 bb의 좌표를 프레임 aa로 표현한다”는 뜻으로 이 책 전체에서 사용한다.

내부 파라미터는 카메라 내부 광학·센서 특성을, 외부 파라미터는 카메라가 로봇/세계 어디에 놓였는지를 나타낸다. 해상도나 crop을 바꾸면 KK도 함께 변할 수 있지만, 카메라가 움직였다고 KK가 바뀌는 것은 아니다.

이해 도움말 — 내부 파라미터와 외부 파라미터를 구분하는 질문

“이 카메라가 픽셀을 어떤 광선으로 해석하는가?”에 답하는 것이 내부 파라미터(intrinsic parameter) KK이고, “그 광선이 로봇이나 월드에서 어느 방향을 향하는가?”에 답하는 것이 외부 파라미터(extrinsic parameter) [R∣t][R|t]다. 렌즈·해상도·crop이 바뀌면 먼저 KK를 의심하고, 카메라 마운트를 다시 조립했거나 충격을 받았다면 [R∣t][R|t]를 다시 측정한다.

4.1.2 렌즈 왜곡

실물 렌즈는 핀홀 모델에서 벗어난다. OpenCV의 일반적인 모델은 방사 왜곡 k1,k2,k3k_1,k_2,k_3과 접선 왜곡 p1,p2p_1,p_2를 사용한다. 정규화 좌표에서 r2=x2+y2r^2=x^2+y^2라 할 때 대표적인 형태는

xd=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2) x_d=x(1+k_1r^2+k_2r^4+k_3r^6)+2p_1xy+p_2(r^2+2x^2) yd=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy y_d=y(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2y^2)+2p_2xy

이다. 정확한 모델과 계수 순서는 사용하는 OpenCV calibration model을 기록한다. 시뮬레이터가 왜곡 없는 영상을 생성해도, 실물 전환 시 동일한 전처리를 만들기 위해 시뮬레이션 영상에 보정 전 왜곡을 합성하거나 실물 영상을 rectify할 수 있다.

4.1.3 역투영과 깊이의 의미

픽셀 (u,v)(u,v)와 optical-axis depth ZcZ_c가 주어지면

Pc=ZcK−1[uv1] \mathbf{P}_c=Z_c K^{-1}\begin{bmatrix}u\\v\\1\end{bmatrix}

로 복원한다. 그러나 센서의 depth가 광축 방향 ZcZ_c인지, 카메라 중심에서 점까지의 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에 고정된다. 두 경우의 외부 파라미터가 업데이트되는 방식이 다르다.

이 장의 예제 코드·설정 파일 (12)

이 장의 자가 점검·가상실습