Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 회전 - cv2.getRotationMatrix2D, cv2.warpAffine

AI 꿈나무 2020. 10. 7. 13:05
반응형

황선규 박사님의 <OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝>, 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다.

 


회전 변환 - 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 함수를 이용하면 영상의 중앙을 기준점으로 회전할 수 있습니다.

 

함수 설명

cv2.getRotationMatrix2D(center, angle, scale) -> retval

• center: 회전 중심 좌표. (x, y) 튜플.
• angle: (반시계 방향) 회전 각도(degree). 음수는 시계 방향.
• scale: 추가적인 확대 비율
• retval: 2x3 어파인 변환 행렬. 실수형.

 

 회전 중심 좌표는 영상의 가로, 세로 1/2 값을 넣어주면 영상의 중앙 좌표로 설정할 수 있습니다.

 

 cv.2getRotationMatrix2D 함수는 결과 값을 2x3 어파인 변환 행렬을 반환합니다.

 

 

예제 코드

src = cv2.imread('tekapo.bmp')

if src is None:
    print('Image load failed!')
    sys.exit()

cp = (src.shape[1] / 2, src.shape[0] / 2) # 영상의 가로 1/2, 세로 1/2
rot = cv2.getRotationMatrix2D(cp, 20, 0.5) # 20도 회전, 스케일 0.5배

dst = cv2.warpAffine(src, rot, (0, 0))

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()

cv2.destroyAllWindows()

 

 

 스케일을 0.5로 지정했기 때문에 크기가 작아졌습니다.

 

 이처럼 영상의 중심을 기준으로 회전할 수 있습니다.

 

반응형