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

JavaFX를 사용해 OpenCV Mat 객체 이미지를 화면에 표시하는 방법

JavaFX 라이브러리는 ImageView라는 이름의 클래스를 제공하며, 이 클래스를 활용하면 이미지를 화면에 간편하게 표시할 수 있습니다. ImageView 클래스는 WritableImage 클래스의 객체를 매개변수로 받습니다.

OpenCV의 Mat 객체에 저장된 이미지를 JavaFX에서 표시하려면 먼저 해당 Mat 객체를 WritableImage 객체로 변환한 뒤, 이를 ImageView 클래스에 전달해야 합니다.

Mat 객체를 WritableImage로 변환하는 3단계

OpenCV Mat 객체를 JavaFX의 WritableImage로 변환하려면 다음과 같은 단계를 거칩니다.

  1. Mat → byte 배열 : Imgcodecs.imencode() 메서드로 Mat 객체를 인코딩해 MatOfByte에 담은 후, toArray() 메서드를 호출해 byte 배열을 추출합니다.
  2. byte 배열 → BufferedImage : ByteArrayInputStream으로 InputStream을 생성하고, ImageIO.read() 메서드를 호출해 BufferedImage 객체로 변환합니다.
  3. BufferedImage → WritableImage : SwingFXUtils.toFXImage() 메서드를 사용해 JavaFX에서 사용할 수 있는 WritableImage 객체로 최종 변환합니다.

예제 코드

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
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 javax.imageio.ImageIO;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;
public class DisplayingImagesJavaFX extends Application {
   @Override
   public void start(Stage stage) throws IOException {
      WritableImage writableImage = loadImage();
      // 이미지 뷰 설정
      ImageView imageView = new ImageView(writableImage);
      imageView.setX(50);
      imageView.setY(25);
      imageView.setFitHeight(400);
      imageView.setFitWidth(500);
      imageView.setPreserveRatio(true);
      // Group 객체 생성
      Group root = new Group(imageView);
      // Scene 객체 생성
      Scene scene = new Scene(root, 600, 400);
      // Stage 제목 설정
      stage.setTitle("Loading an image");
      // Stage에 Scene 추가
      stage.setScene(scene);
      // Stage 내용 표시
      stage.show();
   }
   public WritableImage loadImage() throws IOException {
      // OpenCV 네이티브 라이브러리 로드
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
      // 파일에서 이미지를 읽어 Mat 객체에 저장
      String file = "D:\\images\\tree.jpg";
      Mat image = Imgcodecs.imread(file);
      // 이미지 인코딩
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", image, matOfByte);
      // 인코딩된 Mat을 byte 배열로 변환
      byte[] byteArray = matOfByte.toArray();
      // byte 배열을 BufferedImage로 변환
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      System.out.println("Image Loaded");
      // BufferedImage를 WritableImage로 변환
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }
   public static void main(String args[]) {
      launch(args);
   }
}

실행 결과

위 프로그램을 실행하면 다음과 같은 출력 결과가 생성됩니다.

JavaFX를 사용해 OpenCV Mat 객체 이미지를 화면에 표시하는 방법