OpenCV의 Imgproc 클래스가 제공하는 warpAffine() 메서드는 지정된 이미지에 아핀 변환(affine transformation)을 적용합니다. 이 메서드는 다음과 같은 매개변수를 받습니다.
- 원본 이미지, 결과 이미지, 변환 행렬을 나타내는 세 개의 Mat 객체
- 출력 이미지의 크기를 나타내는 정수 값(Size 객체)
이미지를 회전하려면 먼저 회전 행렬(rotation matrix)을 생성한 뒤, 이를 변환 행렬로서 warpAffine() 메서드에 다른 매개변수와 함께 전달하면 됩니다.
회전 행렬 만들기
회전 행렬은 getRotationMatrix2D() 메서드를 통해 손쉽게 생성할 수 있습니다. 이 메서드는 회전의 중심점(Point), 회전 각도(도 단위), 확대/축소 배율을 인자로 받습니다.
예제 코드
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
public class RotatingAnImage extends Application {
public void start(Stage stage) throws IOException {
// OpenCV 핵심 네이티브 라이브러리 로드
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 이미지 데이터 읽기
String file = "D:\\Images\\elephant.jpg";
Mat src = Imgcodecs.imread(file);
// 결과 이미지를 담을 Mat 객체 생성
Mat dst = new Mat(src.rows(), src.cols(), src.type());
// 회전 중심점(Point) 객체 생성
Point point = new Point(300, 200);
// 회전 변환 행렬 생성 (중심점, 30도, 배율 1)
Mat rotationMatrix = Imgproc.getRotationMatrix2D(point, 30, 1);
// 출력 이미지 크기를 위한 Size 객체 생성
Size size = new Size(src.cols(), src.cols());
// 이미지 회전 적용
Imgproc.warpAffine(src, dst, rotationMatrix, size);
// Mat을 JavaFX WritableImage로 변환
Image img = HighGui.toBufferedImage(dst);
WritableImage writableImage = SwingFXUtils.toFXImage((BufferedImage) img, null);
// ImageView 설정
ImageView imageView = new ImageView(writableImage);
imageView.setX(10);
imageView.setY(10);
imageView.setFitWidth(575);
imageView.setPreserveRatio(true);
// Scene 설정 및 화면 표시
Group root = new Group(imageView);
Scene scene = new Scene(root, 595, 400);
stage.setTitle("Image Rotation Example");
stage.setScene(scene);
stage.show();
}
public static void main(String args[]) {
launch(args);
}
}입력 이미지

실행 결과
위 프로그램을 실행하면 원본 이미지가 지정한 중심점을 기준으로 30도 회전되어 아래와 같은 결과가 출력됩니다.

핵심 정리
Java에서 OpenCV로 이미지를 회전하는 과정은 다음 세 단계로 요약할 수 있습니다.
- 라이브러리 로드: System.loadLibrary()로 OpenCV 네이티브 라이브러리를 불러옵니다.
- 회전 행렬 생성: getRotationMatrix2D()로 중심점, 각도, 배율을 지정한 변환 행렬을 만듭니다.
- 변환 적용: warpAffine()에 원본 Mat, 결과 Mat, 회전 행렬, 출력 크기를 전달하여 회전을 수행합니다.