회전 변환 Rotation transformation
영상을 특정 각도만큼 회전시키는 변환이다. (반시계 방향으로 회전)
반시계 방향으로 세타만큼 회전시킬 때 sin, cos 함수로 표현할 수 있다.
affine 행렬을 생성하고 affwrap 함수를 이용하여 간단히 회전 할 수 있다.
회전 변환을 위한 Affine 행렬을 생성하는 방법은 두 가지가 있다.
1. 영상의 좌측 상단 기준 회전
np.array로 Affine 행렬을 생성하고, 생성한 Affine 행렬을 warpAffine 함수의 입력 인자로 입력해준다.
src = cv2.imread('tekapo.bmp')
if src is None:
print('Image load failed!')
sys.exit()
rad = 20 * math.pi / 180 # 각도 설정
# np.array로 Affine 행렬 생성
aff = np.array([[math.cos(rad), math.sin(rad), 0],
[-math.sin(rad), math.cos(rad), 0]], dtype=np.float32)
dst = cv2.warpAffine(src, aff, (0, 0))
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
⬇︎
좌측 상단을 기준으로 영상이 회전됐음을 볼 수 있다.
2. 영상의 중앙 기준 회전 - cv.2getRotationMatrix2D
OpenCV에서 제공하는 cv.2getRotationMatrix2D 함수를 이용하면 영상의 중앙을 기준점으로 회전할 수 있다.
retval = cv2.getRotationMatrix2D(center, angle, scale)
- center: 회전 중심 좌표. (x, y) 튜플.
- angle: (반시계 방향) 회전 각도(degree). 음수는 시계 방향.
- scale: 추가적인 확대 비율
- retval: 2x3 어파인 변환 행렬. 실수형.
회전 중심 좌표는 영상의 가로, 세로 1/2 값을 넣어주면 영상의 중앙 좌표로 설정할 수 있다.
import sys
import numpy as np
import cv2
src = cv2.imread('tekapo.bmp')
if src is None:
print('Image load failed!')
sys.exit()
cp = (src.shape[1] / 2, src.shape[0] / 2)
rot = cv2.getRotationMatrix2D(cp, 20, 0.5)
dst = cv2.warpAffine(src, rot, (0, 0))
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
스케일 값을 0.5로 해줬기 때문에 크기가 작아졌다.
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 영상 기하학적 변환 : 투시 변환 (0) | 2022.02.02 |
---|---|
[OpenCV with Python] 영상 기하학적 변환 : 어파인 변환 (0) | 2022.02.02 |
[OpenCV with Python] 영상 기하학적 변환 : 이미지 피라미드 (0) | 2022.02.02 |
[OpenCV with Python] 영상 기하학적 변환 : 영상의 대칭 변환 - cv2.flip (0) | 2022.02.02 |
[OpenCV with Python] 영상 기하학적 변환 : 영상의 확대와 축소 - 크기 변환 cv2.resize (0) | 2022.02.02 |