컴퓨터 비전 | Homogeneous coordinate, Perspective projection

7. 동차좌표와 원근투영

컴퓨터 비전 | 동차좌표와 원근 투영

homogeneous coordinate라는 단어와 perpective projection 단어에 대한 이해가 모호해 강의 자료만 봐서는 당최 무슨 얘기를 하는지 이해하기 어려웠다. 찾아보니 동차좌표와 원근 투영이라는 한국어로 번역되는데 한글로만 바꾸어도 훨씬 낫다.

동차 좌표(homogeneous coordinate)

동차 좌표란 평면상의 한 점을 표현하는 방법이다. 동차좌표로 표현된 (x, y, w)는 평면상의 한 점 (x/w, y/w)를 나타낸다. 이 개념을 꼭 놓지말고 가야한다. "동차"라는 단어가 들어가는 이유는 2차 다항식에서 Ax2+Bxy+Cy2+DAx^2 + Bxy + Cy^2 + D을 (x, y) = (x/w, y/w)로 바꾸어 넣고 w2w^2을 곱해주면, x, y, w에 대해서 모든 항이 2차 다항식이 되게 된다. D에도 w2w^2가 곱해져서 그런데 이를 수학적으로 이해하는 것이 중요하진 않다. 다만 왜 동차라는 단어가 붙었는지 이해하고 넘어가고 싶었다.
동차 좌표의 여러 점은 평면 상의 한 점을 나타낼 수 있다. (x, y, 1), (2x, 2y, 2), (ax, ay, a) 모두 3차원 값으로 나눠주면 x-y 평면상의 (x, y) 점을 나타낸다. 이 방식은 원근 투영과 깊은 관계가 있다.

원근 투영(perspective projection)

원근 투영이란 세상에 있는 어떤 물체를 카메라 내의 평면에 투영시키는 것을 말하는데, 한 점을 투영시킬 수 있으면 물체를 투영시킬 수 있으므로, 한 점을 기준으로 설명한다.
카메라에서 바라본 어떤 물체의 좌표를 (Xc, Yc, Zc)라고 한다면, 이 점을 이미지 평면에 원근 투영 시킨 좌표는 (Xc, Yc, Zc/d)이고 이를 평면 좌표로 표현하면 ((d/Zc)*Xc, (d/Zc)*Yc, 1)이 된다. 여기서 d는 이미지 평면과 원점(카메라 핀 홀 중심)과의 거리이다.

왜 동차좌표를 쓸까.

이쯤되면 의문이 들 수도 있다. 왜 복잡하게 동차좌표라는 걸 쓰는 걸까. 여러가지 이유가 있지만 가장 근본적인 이유는 세상에 있는 물체의 좌표를 이미지의 위치로 표현하고 싶을 때 행렬식으로 계산할 수 있도록 하기 위해서다. 행렬식으로 계산이 가능해지면 컴퓨팅적으로 계산속도가 매우 빨라지기 때문에 애를 쓰고 이렇게 별 짓을 다 하는 것이다.

카메라 좌표 vs 월드 좌표

요새 날씨가 좋으니깐 벚꽃 나무가 활짝 피었다. 벚꽃 나무를 내가 정한 x,y,z축으로 표현해보자. 이게 월드 좌표계이다. 이 때 내가 좋은 구도를 잡아 핸드폰으로 벚꽃나무를 찍으려고 한다. 핸드폰의 카메라와 벚꽃나무를 연결하는 직선을 z’축으로 하는 어떤 x’, y’, z’ 축을 만들 수 있다. 이게 바로 카메라 좌표계이다. 우리가 지금까지 얘기했던 원근 투영 좌표는 모두 카메라 좌표를 기준으로 생각했다. 하지만 카메라의 위치가 변한다고 처음에 정한 월드 좌표계가 바뀔 순 없다. 그래서 우리는 카메라 좌표를 월드 좌표로 바꿔야한다.
이것이 바로 좌표계 변환이고, 좌표계 변환에는 월드 좌표계를 회전시키는 회전변환, 원점을 카메라 좌표계의 원점에 맞춰주는 이동변환이 필요하다.
그 다음에 우리가 지금까지한 원근 투영 행렬을 붙여주고, 마지막으로 이미지를 카메라 픽셀상의 좌표로 맞춰주는 작업이 필요하다. 여럿 붙인 행렬은 결국 하나의 행렬로 표현할 수 있기 때문에 한 번의 행렬계산으로 위에서 말한 모든 과정을 해결할 수 있다.
지금까지 부족한 설명으로 아래 두 그림을 이해할 수 있다면 너무 좋을 것 같지만 혹시나 이해가 안되더라도 당연한 것이니 참고 사이트를 다녀오면 훨씬 더 도움이 될거라고 생각한다. : )

참고 사이트

내 설명은 강의자료를 보다 막힌 부분만 정리한 것이라 더 자세한 설명이 궁금하다면 아래 두 멋진 블로그를 읽어보면 더 이해가 쉬울 것 같다.
다크프로그래머님 블로그 :: 원근 투영 https://darkpgmr.tistory.com/82
신당기님 블로그 : 동차 좌표 http://m.blog.daum.net/shksjy/229?tp_nil_a=1

댓글

이 블로그의 인기 게시물

[Linux, Unix] export, echo 명령어 알아보기

뼈속 깊이 이해하기 :: 1. 허프만 코딩

IEEE 754 부동 소수점 반올림과 근사