Transformation matrix
변형 행렬들 선형 대수학에서 선형 변환(linear transformations)은 행렬(matrix,매트릭스)로 나타내는 것이 가능하다. 또한 역사적으로 행렬상에서 행렬을 변환(또는 변형)시키는 다양한 표현방법이 조사되어왔다.
Category
- Rigid Transformation
- Rigid Transform은 형태는 유지하고, 회전과 이동 변환
- 강체(Rigid)는 2개의 모션벡터만 있다면 변환이 가능합니다. 즉 2개의 좌표점을 이용해서 변환 하기 때문에 변환에 제약이 있다고 생각하시면 되겠습니다. 여기서 포인트는 형태가 변하지 않는다는 것 을 포인트로 생각하면 됩니다. 즉 정사각형은 계속 정사각형이어야 하는 것 입니다.
- Similarity Transformation
- Similarity 변환 즉, 닮음 변환은 rigid 변환에 추가적으로 스케일 변화까지 허용한 변환입니다
- Affine Transformation
- Affine 변환은 직선, 길이(거리)의 비, 평행성(parallelism)을 보존하는 변환이다.
- 호모그래피 (Homography) (Projective Transformation)
- Homography Transform: Projection Transform
- 형태와 회전, 회전, 이동 을 전부 포함하는 변환
OpenCV methods
OpenCV에서 2D 변환과 관련된 함수들을 정리해 보았습니다.
-
estimateRigidTransform()
- 다수의 매칭쌍으로부터 similarity 변환이나 affine 변환을 구할 때 사용 (파라미터로 선택 가능). 내부적으로 RANSAC을 이용.
-
opencv2/video/video.hpp
-
getAffineTransform()
- 3쌍의 입력 매칭쌍으로부터 affine 변환을 구해줌.
-
opencv2/imgproc/imgproc.hpp
-
invertAffineTransform()
- affine 변환의 역변환을 구해줌.
-
opencv2/imgproc/imgproc.hpp
-
getPerspectiveTransform()
- 4쌍의 입력 매칭쌍으로부터 homography 행렬을 계산해 줌.
-
opencv2/imgproc/imgproc.hpp
-
findHomography()
- 다수의 매칭쌍으로부터 homography 행렬을 계산해 줌 (근사 방법은 전체 데이터 fitting, RANSAC, LMedS 중 선택).
-
opencv2/calib3d/calib3d.hpp
-
transform()
- 2×2 또는 2×3 변환행렬(similarity, affine 등)을 이용하여 좌표변환을 할 때 사용.
-
perspectiveTransform()
- 3x3 homography 변환행렬 또는 4×4 변환행렬을 이용하여 좌표변환을 할 때 사용.
Scaling matrix
각 축의 크기를 변환할 경우 아래와 같은 공식이 성립된다.
-
x' = ax
-
y' = by
-
z' = cz
이를 행렬로 변환할 경우 아래와 같다.
Size_matrix.gif
Rotation matrix
회전행렬 유도 In linear algebra, a rotation matrix is a matrix that is used to perform a rotation in Euclidean space.
회전을 위한 행렬의 총칭이다.
In two dimensions
In two dimensions, every rotation matrix has the following form,
Positive_rotation_matrix.png
The direction of vector rotation is counterclockwise if θ is positive (e.g. 90°), and clockwise if θ is negative (e.g. −90°). Thus the clockwise rotation matrix is found as
Negative_rotation_matrix.png
유도 방법
유도방법은 아래와 같다.
우측 그림의 (가)와 같이 카메라를 기준으로 좌표가 (x, y)인 A점에 물체가 있다고 할 때, 카메라가 왼쪽으로 θ=30° 만큼 회전하면 같은 물체에 대해 그 물체가 보이는 좌표값은 (x', y')이 된다. 이 때 x'과 y'은 원래 좌표와 각 θ에 의해 결정된다. 그림의 (나)를 자세히 보면 아래와 같은 관계가 성립됨을 알 수 있다.
-
x' = xcosθ - ysinθ
-
y' = xsinθ + ycosθ
θ가 음의 방향(시계방향)인 경우 아래와 같이 회전 행렬을 변경해야 한다.
-
x' = xcosθ + ysinθ
-
y' = -xsinθ + ycosθ
이는 z축(지면에 대해 들어가고 나오는 방향)을 기준으로 회전한 것과 같다. 이를 행렬로 표현하면 아래와 같다.
Rotation_matrix_3d_z.gif
같은 방법으로 x축, y축을 중심으로 회전시키는 행렬은 아래와 같다.
Rotation_matrix_3d_xy.gif