Knowledge/Vision

3D transformation(R, t) matrix notation

침닦는수건 2022. 7. 13. 17:14
반응형

Computer vision에서 3D transformation (rotation + translation)은 굉장히 흔히 접하고 많이 사용한다.

 

3차원 point의 좌표계 변환, 카메라 자세, extrinsic calibration 등 여러 키워드에서 반드시 등장한다.

 

그런데 문제는 transformation의 방향이 도대체 어느 방향인지 값만 봐서는 알 수가 없다는 것이다. 

 

 

 

예를 들어, camera-to-world인지 world-to-camera인지, camera 1 to camera 2인지 camera 2 to camera 1인지 구분할 수 없다.

 

위 그림에서만 봐도 화살표 없이는 R,t가 어느 방향으로의 변환인지 알 수 없다.

(사실 화살표를 알아도...해석하기 나름이라 헷갈린다.)

 

이것을 구분하지 못하는 순간, 카메라가 돌고 머리가 돌기 시작한다...

 

따라서 보통 vision에서 사용하는 3D transformation (4x4) matirx에는 방향에 대한 notation을 표기하게 되어 있는데 그것을 명확히 정리하고자 한다.

 

(나는 다음과 같이 배웠는데, 코드를 보다 보면 반대로/제멋대로 표기하는 경우도 많긴 하더라. 다음 내용이 아니다라고 반박 시 너 말 맞음.)

 

 

간단히 나열하자면, 다음 3가지를 외우면 된다.

  • Transformation matrix, T의 notation은 행렬 연산 순서에 맞추어 오른쪽에서 왼쪽으로 적는다.

  • 우측 좌표계에서 좌측 좌표계로 변환하는 transformation matrix라고 해석한다.
    - 예) 3D point들을 camera 좌표계(c)에서 world 좌표계(w)로 변환한다. 결과적으로 world coord. 3D point가 나옴.

  • 왼쪽 좌표계에서 바라본, 우측 좌표계의 축, 원점 이라고 해석한다.
    - 예) world 좌표계(w)에서 바라본 camera 좌표계의 원점, 축들의 rotation, translation이다. 
    - 즉, world 좌표계(w)에서 바라본 camera(c)의 자세라고 해석할 수 있다.

 

위와 같이 정리하면, 복잡한 변환 관계도 명확히 이해가 가능하다.

 

 

예를 들어, i번째 camera와 j번째 camera가 있는데 각각의 자세 (T_wi, T_wj) 만을 알고 있다고 했을 때, 카메라 i와 j 간의 관계를 구하고자 한다면 단순히 알파벳 순서 맞추기만 하면 된다.

 

알고 있는 T_wj의 inverse를 통해 T_jw를 구하고 T_wi에 좌측에 곱해주면 행렬 연산 순서에 따라, T_ji가 나온다.

 

해석하면 다음과 같다.

 

- 3D point들을 camera i 좌표계에서 camera j 좌표계로 바꾸어주는 transformation matirx.

- caemra j 좌표계에서 바라본 camera i의 자세 

 

그 반대 방향을 원한다면 결과의 inverse를 취하면 된다.

 

 이 규칙을 따라 표기하고 코드를 작성하고 해석하면, 헷갈릴 일을 현저히 줄일 수 있다.

(모든 코드가 이렇게 작성되어 있으면 좋겠다....)

 

 

Tips

 

실전 코드 리뷰 중에는 해당 코드 저자가 무조건 위의 규칙을 따라서 notation 표기를 했다고 믿을 수 없으니, 일단 시각화해보고 notation을 반대로 썼는지 맞게 썼는지 확인 후 위 규칙에 따라 모든 코드를 정렬하고 사용하면 편하다.

 

경험적으로 보면, 아래와 같이 2나 -to-를 섞어서 표기하는 경우가 가장 많은데 notation 정리를 꼭 해두자. 

 

 

위 경우는 간혹 3d point를 transpose된 상태로 쓰시는 분들이 matrix를 우측에 곱하는 일이 있는데, 그럴 경우에는 cam2world라고 쓰는 것이 이해가 빠르므로 어느 정도 납득할 수는 있다. (이해까지는 안간다...)

 

그런데 2나 -to-도 없이 그냥 냅다 순서 뒤집어서 notation 표기하는 사람들은 진짜 반성했으면 좋겠다.

 

그 사람들은 나중에 notation 맘대로 표기하거나 표기 안 하는 사람들과 같이 일하길 바란다.

 

반응형