3. The Pinhole Camera Model
이전에는 카메라 모델을 통해 3차원을 변환을 알아보기 전에, 2D -> 2D의 Homograpy를 알아보았었습니다. 이번에는 본격적으로 기본적인 카메라 모델인 pinhole camera model부터 살펴보겠습니다.
From 2D to 3D
가장 먼저 3D가 어떻게 2D영상으로 영상에 매치되는지를 모델링할 필요가 있습니다.
그래서 3D의 $[X, Y, Z]$로 표현되는 물리적인 지점이 거쳐서 카메라에 맺히는 2D의 $[x, y, 1]$과 어떻게 대응되는지 모델링을 해야합니다. 이걸 하기 위해 먼저 카메라와 상이 맺히는 지점의 거리가 1이라 가정합니다.
Simplification of how camera work
위 그림은 실제 3D에 있는 $[X, Y, Z]$가 어떻게 이미지 좌표로 변환되는가에 대한 그림입니다. 닮음을 이용해서 실제 이미지에 맺히는 상의 좌표를 계산하면 $($fX/Z, fY/Z)^T$가 됩니다. 위 상황에서는 항상 편의상 $C$를 (0, 0)으로 두었습니다.
위 그림을 homogeneous coordinates로 표현하게 되면, 위와 표현할 수 있습니다. homogeneous coordinates이므로 z축에 1을 추가하고 scale에 상관없으니까 $Z$를 곱했습니다. 그리고 이를 행렬로 나타내게 되면, 위의 $f$가 포함된 꼴이 결국 카메라가 어떻게 동작하는지를 나타내는 행렬이라고 볼 수 있습니다.
최종적으로 $C$가 $p_x, p_y$만큼 이동했다고 하면, 최종적으로 $K$로 표현되는 Camera Intrinsic Matrix는 위와같이 표현될 수 있습니다. 우리는 앞으로 $x = K[I|0]x_{cam}$으로 축약된 식을 많이 보게될 것입니다. 앞으로 우리는 $K$라는 값을 calibration pattern이라는 것을 통해 구할 것입니다.
이는 3D -> 2D입니다, 2D -> 3D를 할 수는 없습니다, 그 이유는 $Z$의 값을 모르기 때문입니다. 그래서 반대 방향 mapping은 존재할 수 없습니다.
Radial distortion
우리는 실제 렌지를 통해 상을 관찰하게 되면, 렌즈 어디를 통과하느냐에 따라서 회전 정도가 다르기 때문에 직선이 휘어져 있는 것처럼 보이는 경우가 생기게 됩니다. 이러한 경우를 radial distortion이라고 하는데, 이러한 사소한 차이가 3D vision에서는 큰 차이로 연결되기도 해서, 실무에서는 radial distortion을 calibration하는 게 매우 중요합니다. 다만 앞으로 카메라 모델을 얘기할때에는 이러한 calibration이 되었다고 가정하고 얘기하겠습니다.
식으로 보면, $\tilde{r}$이라는 그림의 중심점의 거리에 따라 기존 좌표에 변형이 있었다고 가정을 합니다. $L$함수는 거리에 따라 변하는 함수로 피팅을 해줄 수 있습니다. 실제로 OpenCV에서는 2차원 함수를 활용해 피팅한다고 합니다. 뿐만 아니라 2020년에는 Deep Network을 통해 이를 피팅하는 연구도 활발히 진행되었다 합니다.
4. Camera Pose and Calibration
이전 Chapter3에서는 3D상의 $[X. Y, Z]$가 원점의 카메라로 projection된다고 가정했습니다. 하지만 $K$ matrix를 구하기 위해서는 모든 카메라가 항상 원점을 보고 있다고 가정을 할 수 없습니다. 그럼 가장 먼저 카메라가 움직였을때 어떻게 모델링되는지 알아보겠습니다.
What if we move the camera?
간단히 어떠한 $[R | t]$라는 선형변환 후에 $x_{cam}$이라는 좌표로 오게되었다고 하면 됩니다. 그럼 내가 알고있는 원점을 기준으로 한 좌표계로 변환이 된다고 할 수 있습니다.
이때 $R$ matrix는 앞 포스팅에서 본 SE3변환입니다. $R$ matrix에서 주목할만한 특징은 모든 column vector가 orthonormal하다는 중요한 특징이 있습니다. $t$ matrix는 그냥 traslate matrix입니다.
Flexible Camera Calibration By Viewing a Plane From Unknown Orientations [Zhang, ICCV 1999]
위의 내용을 이해하고 났다면, 이제 현실의 알고있는 사물을 이용해서 $K$ matrix의 특성을 뽑아내겠다는 알고리즘을 이해할 수 있습니다.
먼저 우리가 Calibration하기 위한 패턴은 위와같은 checker board pattern을 활용하게 됩니다. 우리는 $K$ matrix와 각 이미지마다 독립적인 $R, t$를 모릅니다. 다만 우리가 안다고 하는 것은 모든 이미지가 $K$ matrix즉 camera의 intrinsic matrix를 공유한다는 점입니다.
우리는 checker board의 각 corner를 특징점으로 사용할 것인데, 이들은 실제 3D상의 z=0 plane에 있다고 가정할 것입니다. $X = [X_1, X_2, 0, 1]^T$와 같이 표현될 수 있겠습니다. 그럼 다음과 같이 식을 작성할 수 있습니다.
$$\lambda 'x = K[r_1, r_2, r_3|t]X or x = \lambda K[r_1, r_2|t][X_1, X_2, 1]^T$$
위 식에서 $lambda$는 homogeneous coordinates에서의 변환이기 때문에 아무거나 곱해도 상관없음을 나타낸 것입니다. 또한, z=0 plane에서의 사진이라고 가정했기 때문에, 이를 2D상에서의 변환으로 가정할 수 있어 z축과 관련된 항을 제거해줄 수 있습니다. 이렇게 되면 우항 좌항이 다 2D가 되며 두 항 모두 homogeneous coordinates이므로 이전에 다루었던 2D상에서의 homogeneous 변환을 구하는 식을 사용할 수 있습니다. ($x' = hx, Ah = 0$)
그래서 $ \lambda K[r_1, r_2|t] $를 $H$로 치환해주겠습니다. 그리고 $K^{-1}$를 양변에 곱해주면, $K^{-1}H = \lambda[r_1,r_2|t]$와 같은 등식이 성립합니다. 이 등식을 풀어야 하지만, $H$에서 $K$는 일정하니까 괜찮지만, $R. t$가 이미지마다 계속 바뀝니다. 그래서 이를 분리해주기 위해서는 조건이 하나 더 필요한데, 여기서 $R$의 모든 열벡터가 orthornormal하다는 특성을 사용합니다. 그럼 $r_{1}^{T}r_2 = 0, r_{1}^Tr_1 = r_{2}^{T}r_2 = 1$이라는 조건을 얻을 수 있습니다. 이제 우리가 모르는 $K, H$를 변수로 놓고 $H = [h_1, h_2, h_3]$라 할때, 식을 정리하게되면, $h_{1}^{T}K^{-T}K^{-1}h_2 = 0 and h_{1}^{T}K^{-T}K^{-1}h_1 = h_{2}^{T}K^{-T}K^{-1}h_2$가 성립합니다.
최종식은 이전에 봤던 $Ah = 0$과 같이 표현이 불가하여 SVD를 통한 해를 구할 수 없습니다. 다만 우리는 실질적으로 다른 최적화 기반 방법들로 해를 구하게 될 것입니다. 이때 Levenberg Marquardt라는 최적화방법이 사용된다고 합니다. 결국 OpenCV상에 구성되어있는 함수를 통해 사용하게 될 것입니다.