말랑말랑제리스타일

[OpenCV 공부방]간단한 이미지 회전 Rotate 함수의 구조 본문

프로그래밍/OpenCV 영상처리

[OpenCV 공부방]간단한 이미지 회전 Rotate 함수의 구조

제리제리 2021. 7. 3. 22:15

OpenCV에서 이미지 회전은 두가지 방법이 있습니다

정석적인 방법은 변환행렬을 생성하고 그 변환행렬과의 삼각함수 연산을 통해 회전된 새로운 매트릭스를 생성하는 방법이죠

 

그리고 오늘 소개해드릴 OpenCV의 Rotate 함수는 이미지의 중심을 중심점으로 해서 이미지를 특정 각도(90도, 180도, 270도)로만 회전이 가능한 함수입니다

단, 앞서 말한 것과 같이 OpenCV의 Rotate 함수로는 90도, 180도, 270도가 아닌 애매한 175도 이런 회전은 불가능한 함수이고 중심점도 변환행렬 생성 방식과 달리 이미지의 정중앙 외에 지정이 불가합니다

 

간단하게 다시한번 OpenCV에서 변환행렬을 생성해 이미지를 회전하는 방식과 Rotate 함수를 사용하는 방식 두가지 방법의 장단점을 설명해보면

  변환행렬 생성 Rotate 함수
장점 이미지 회전의 중심축, 회전 각을 자유자재로 설정해줄 수 있음 간단하게 사용이 가능
단점 배경지식 없이 이해하기 어려움
진최소 2~3개의 OpenCV 함수 사용
중심축이나 회전 각에 대해 한계가 큼
이미지 사이즈가 바뀜(장점이자 단점)

이렇게 됩니다

 

일단 표에서 말한 것과 같이 OpenCV에서 변환행렬을 생성해서 회전하는 방식은 설명도 길어지고

오늘의 주인공은 OpenCV에서 간단하게 이미지를 회전할 수 있는 함수인 Rotate 함수이기 때문에

바로 OpenCV의 이미지 회전 함수 Rotate 함수의 함수 원형을 보겠습니다

 

void rotate(InputArray src, OutputArray dst, int rotateCode);

이게 바로 OpenCV에 있는 Rotate 함수의 원형인데요

inputArray src는 회전할 입력 이미지로 Mat 클래스를 사용할 수 있습니다

outputArray dst는 회전 이후 출력 이미지로 마찬가지로 OpenCV의 Mat 클래스를 이용할 수 있죠

마지막으로 rotateCode는 회전 각도 지정 코드입니다

여기서 OpenCV의 회전각도 지정 코드 상수 세가지 중 하나를 사용할 수 있는데요

ROTATE_90_CLOCKWISE : 시계방향으로 90도 회전
ROTATE_180 : 180도 회전
ROTATE_90_COUNTERCLOCKWISE : 반시계방향으로 90도 회전(시계방향 270도 회전)

이렇게 세가지이고 실제 사용 예를 보여드리겠습니다

자 이 이미지가 오늘 OpenCV Rotate함수 설명에 사용할 이미지 원본...은 아니고 원본의 그레이 스케일 버전입니다

상당히 학구적?이죠??

 

rotate(src, dst, ROTATE_90_CLOCKWISE);

Roate 함수를 사용해 시계방향으로 90도 회전시킨 결과를 보겠습니다

이미지의 정 중앙을 중심으로 시계방향으로 90도 회전한 결과를 볼 수 있습니다

rotate(src, dst, ROTATE_180);

마찬가지로 RotateCode에 ROTATE_180이라는 OpenCV 상수를 넣어주면

이렇게 180도 회전된 결과를 얻을 수 있습니다

여기서 주의할게

가~~~~~끔 헷갈리는 분들이 계신데 180도 회전과 상하 대칭은 다른 연산으로

왼쪽은 위와 같이 180도 회전한 이미지이고 오른쪽이 상하 대칭이동한 이미지로 좌우가 바뀌게 된다는 차이가 있고

내부적으로는 더 큰 차이가 있을 수 있겠죠

rotate(src, dst, ROTATE_90_COUNTERCLOCKWISE);

마지막으로 Roate 함수를 이용한 반시계 방향으로 90도 회전은

이런 결과를 얻을 수 있겠죠

 

마지막으로 덧붙여서 OpenCV의 Rotate 함수를 사용할 때 주의할 점은 이미지 사이즈 자체가 바뀐다는 점입니다

예를 들어 시계방향으로 90도 회전을 각각 변환행렬 이용과 Rotate 함수를 이용해서 둘다 결과를 내보면

변환 행렬을 이용해 변환하는 경우 기존의 이미지 사이즈를 유지하면서여백을 0으로 채우고 90도로 회전하면서 크기를 벗어나는 부분은 과감히 잘라내죠

그러나 위에서 본 것처럼 OpenCV에서 가장 간단한 회전방법 Rotate 함수를 이용하면 변환된 이미지를 기준으로 이미지 사이즈가 바뀌고 손실되는 데이터가 없죠

 

이런 면에서는 어떤 방법이 좋다고 판단할 수는 없을 것 같고

적절한 상황에서 적절한 OpenCV함수를 사용하는게 좋다고 생각합니다

반응형
Comments