[Vision] OpenCV getRotationMatrix2D Theory [ Homogenous coordinate in Transformation Matrix ]
영상의 한 좌표를 중심으로 회전을 시키는 행렬은 식 1과 같다.
식 1은 Homogenous coordinate(동차 좌표)를 이용한 Transformation Matrix(변환 행렬)이다.
[2]를 참고하면 이에 대한 이론이 설명되어 있는데, 이를 정리하고자 한다.
Homogenous coordinate in Transformation Matrix
Why Homogeneous Coordinates?
- 수학자들은 보통 방정식에서 scaling factors를 제거하기 위해 동차좌표를 사용한다.
- 동차좌표를 사용하게 되면 행렬 변환을 위한 곱셈 계산이 매우 효율적이게 된다.
- 동차좌표는 직관적이지는 않지만 그래픽 작업 측면에서 매우 편리하다.
- 2x2 이동행렬은 존재하지 않기 때문에 동차좌표 시스템을 이용함으로써 2x2 이동행렬을 행렬간의 곱으로 나타낼 수 있다.
- 동차좌표는 affine transformations을 일관되게 같은 형태로 다룰 수 있게 해준다. 2D affine transformations는 항상 [ 0 0 1 ]을 bottom row로 갖는다.
"affine point"는 w-coordinate가 항상 1인 "linear point" 이다.
affine transformation의 결과는 또 다른 affine point가 된다.
한 점 (x, y)는 동차 좌표에서 (xw, yw, y)로 다시 쓰여질 수 있다.
"homogeneous parameter" w는 x, y와 같이 0이 아닌 값으로써, 첫번째 인자와 두번째 인자를 세번째 인자로 나누어 (x, y) 좌표를 쉽게 복원할 수 있는 값이다.
- 어떠한 점 (x, y)가 다음과 같다 하자.
- 만약 w=1이라고 한다면 (x, y)는 다음과 같아진다.
Homogeneous Matrix in Scaling Matrix
동차 좌표에서 scaling matrix는 다음과 같다.
(xw, yw, w)를 곱하면 다음과 같다.
이를 w로 나누게 되면 우리가 찾는 scaled point는 다음과 같다.
Homogeneous Matrix in Rotation Matrix
반시계 방향의 회전행렬은 다음과 같다.
이를 동차 좌표를 사용하여 나타내면 다음과 같아진다.
어떤 점 (x, y)를 동차 좌표 (xw, yw, w)로 회전 행렬에 적용하면 다음과 같다.
Homogeneous Matrix in Translation Matrix
동차 좌표에서 (tx, ty)만큼의 이동 행렬은 다음과 같이 나타내어 진다.
이를 w로 나누면 다음과 같이 제대로 된 translated point를 얻을 수 있다.
이런 tanslated point를 얻도록 하는 2x2 이동행렬은 존재하지 않기 때문에 우리는 동차좌표(Homogeneous Coordinates)를 사용하는 것이다.
In General
1. Translation
2. Rotation
3. Scaling
Rotation about an arbitrary point
- 점 (xc, yc)에 대한 반시계 방향 회전을 위한 동차 좌표 변환 행렬은 다음의 세 단계로 진행된다.
1. Translation to the origin
일단 점 (xc, yc)를 원점으로 옮긴다.
2. Rotation about the origin
이 후, 원점을 기준으로 회전을 시킨다.
3. Translation back to its correct position
이 후, 이동시키고자 했던 위치로 다시 점을 이동시킨다.
Composite transformations
- 행렬은 변환 시퀀스를 표현하는 편리하고 효율적인 방법이다.
- 행렬에서는 교환 법칙이 성립하지 않으므로 변환 순서가 매우 중요하다.
- 회전변환과 이동변환을 수행하고자 한다면 다음과 같은 수식으로 구성되게 된다.
오른쪽부터 변환해주어야 한다는 사실에 유의하며, 최종적으로 가장 아래의 수식이 만들어진다.
OpenCV의 Translation Matrix
서두에 언급했듯이 OpenCV에서 taranslation matrix는 다음과 같다.
보면 알겠지만 우리가 지금까지 유도한 최종식과 부호가 다른 부분들이 존재하는데,
그 이유는 우리가 지금까지 유도했던 수식은 반시계 방향이고, 그래픽에서의 영상에서의 수식은 시계 방향이기 때문이다[3].
cos 파형은 (+), (-) 방향에 대해 부호의 변화가 없지만 sin 파형은 (+), (-) 방향에 대해 부호가 반전된다.
따라서 sin(theta) 에 대해 부호를 반전 시켜주면 OpenCV에서 사용되는 transformation matrix를 얻을 수 있다.
[1] docs.opencv.org/3.4/da/d54/group__imgproc__transform.html#gafbbc470ce83812914a70abfb604f4326
(access on 23/11/2020)
[2] uomustansiriyah.edu.iq/media/lectures/9/9_2019_04_24!06_36_54_PM.pdf
(access on 23/11/2020)
[3] en.wikipedia.org/wiki/Rotation_matrix