Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

OpenCV로 Java에서 이미지 이동(Translation) 처리하기 – warpAffine() 예제

OpenCV의 warpAffine() 메서드란?

OpenCV의 Imgproc 클래스가 제공하는 warpAffine() 메서드는 지정된 이미지에 아핀 변환(Affine Transformation)을 적용합니다. 이 메서드는 다음과 같은 매개변수를 받습니다.

  • 세 개의 Mat 객체 — 각각 원본 이미지(src), 결과 이미지(dst), 그리고 변환 행렬(transformation matrix)을 나타냅니다.
  • 출력 이미지 크기 — 결과 이미지의 크기를 나타내는 Size 객체입니다.

이미지를 이동(Translate)시키려면 먼저 이동 행렬을 생성한 뒤, 이를 변환 행렬 매개변수로 전달하고 나머지 인자들과 함께 warpAffine() 메서드를 호출하면 됩니다.

예제 코드

아래는 JavaFX와 OpenCV를 함께 사용하여 이미지를 로드하고, 아핀 변환 행렬을 만든 뒤, 화면에 결과를 출력하는 전체 예제입니다.

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.MatOfPoint2f;
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 TranslatingAnImage 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);
      // 대상(destination) 행렬 생성
      Mat dst = new Mat(src.rows(), src.cols(), src.type());

      Point p1 = new Point(0, 0);
      Point p2 = new Point(src.cols() - 1, 0);
      Point p3 = new Point(0, src.rows() - 1);
      Point p4 = new Point(src.cols() * 0.0, src.rows() * 0.33);
      Point p5 = new Point(src.cols() * 0.85, src.rows() * 0.25);
      Point p6 = new Point(src.cols() * 0.15, src.rows() * 0.7);

      MatOfPoint2f ma1 = new MatOfPoint2f(p1, p2, p3);
      MatOfPoint2f ma2 = new MatOfPoint2f(p4, p5, p6);
      // 변환 행렬 생성
      Mat tranformMatrix = Imgproc.getAffineTransform(ma1, ma2);
      // Size 객체 생성
      Size size = new Size(src.cols(), src.cols());
      // 아핀 변환(warpAffine) 적용
      Imgproc.warpAffine(src, dst, tranformMatrix, size);
      // 행렬을 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 Translation example");
      stage.setScene(scene);
      stage.show();
   }

   public static void main(String args[]) {
      launch(args);
   }
}

코드 핵심 포인트

  • System.loadLibrary()를 통해 OpenCV 네이티브 라이브러리를 먼저 로드해야 합니다.
  • getAffineTransform()은 변환 전 삼각형 좌표(ma1)와 변환 후 삼각형 좌표(ma2)를 비교하여 2x3 아핀 변환 행렬을 계산합니다.
  • 계산된 변환 행렬을 warpAffine()에 전달하면 원본 이미지가 새로운 위치로 이동된 결과가 dst 행렬에 저장됩니다.

입력 이미지

OpenCV로 Java에서 이미지 이동(Translation) 처리하기 – warpAffine() 예제

출력 결과

위 프로그램을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

OpenCV로 Java에서 이미지 이동(Translation) 처리하기 – warpAffine() 예제