OpenCV의 내장 함수를 활용하면 이미지를 손쉽게 회전할 수 있습니다. 이미지를 회전하려면 highgui.hpp와 imgproc.hpp 헤더 파일을 먼저 포함해야 하며, 이 글에서는 이미지 회전에 필요한 핵심 함수들을 하나씩 살펴보겠습니다.
주요 함수 소개
이미지 회전에 사용되는 핵심 함수는 다음과 같습니다.
- getRotationMatrix2D(): 회전 중심점, 회전 각도, 배율(scale)을 인자로 받아 2D 회전을 위한 아핀 변환 행렬(affine transformation matrix)을 생성합니다.
- warpAffine(): 앞서 생성한 아핀 변환 행렬을 원본 이미지에 실제로 적용하여 회전된 결과 이미지를 만들어냅니다.
또한 createTrackbar()를 사용하면 마우스로 슬라이더를 조작하면서 회전 각도를 실시간으로 변경해 볼 수 있어 학습 효과가 뛰어납니다.
예제 코드
다음 프로그램은 C++를 사용하여 OpenCV에서 이미지를 회전하는 전체 과정을 보여줍니다.
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat before_rotation = imread("bright.jpg");//이미지를 행렬로 불러오기
namedWindow("BeforeRotation");//원본 이미지를 출력할 창 선언//
imshow("BeforeRotation", before_rotation);//회전 전 이미지 출력//
namedWindow("AfterRotation");//회전된 이미지를 출력할 창 선언//
int Rotation = 180;//회전 각도 초기화//
createTrackbar("Rotation", "AfterRotation", &Rotation, 360);//트랙바 생성//
int Height = before_rotation.rows / 2;//행의 중앙 지점 계산//
int Width = before_rotation.cols / 2;//열의 중앙 지점 계산//
while (true) {
Mat for_Rotation = getRotationMatrix2D(Point(Width, Height), (Rotation - 180), 1);//2D 회전을 위한 아핀 변환 행렬//
Mat for_Rotated;//회전된 이미지를 담을 행렬 선언
warpAffine(before_rotation, for_Rotated, for_Rotation, before_rotation.size());//아핀 변환 적용//
imshow("AfterRotation", for_Rotated);//회전된 이미지 출력//
int termination = waitKey(30);//회전 효과를 위한 30밀리초 대기//
if (termination == 27){//Esc 키를 누르면 종료//
break;
}
}
return 0;
}코드 설명
프로그램의 동작 흐름은 다음과 같습니다.
- imread()로 'bright.jpg' 파일을 읽어 Mat 객체에 저장합니다.
- 원본 이미지와 회전된 이미지를 각각 출력할 두 개의 창을 namedWindow()로 생성합니다.
- createTrackbar()로 0~360 범위의 트랙바를 만들어 사용자가 직접 회전 각도를 조절할 수 있게 합니다. 초기값은 180으로 설정됩니다.
- 이미지 중앙 좌표(rows/2, cols/2)를 계산하여 회전의 기준점(중심축)으로 사용합니다.
- while 루프 안에서 트랙바 값이 바뀔 때마다 getRotationMatrix2D()로 새로운 변환 행렬을 만들고, warpAffine()으로 이를 이미지에 적용합니다.
- waitKey(30)로 30밀리초마다 화면을 갱신하여 부드러운 회전 효과를 연출하고, Esc 키(ASCII 코드 27)가 눌리면 프로그램을 종료합니다.
참고로 트랙바 값에서 180을 빼는 이유는 초기 화면에서 이미지가 정방향(0도)으로 표시되도록 하기 위함입니다.
실행 결과
프로그램을 실행하면 왼쪽에는 원본 이미지가, 오른쪽에는 트랙바로 조절한 각도만큼 회전된 이미지가 나타납니다. 슬라이더를 움직이면 이미지가 실시간으로 부드럽게 회전하는 것을 확인할 수 있습니다.