Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaFXを使用してOpenCVのMatオブジェクトを表示する方法

JavaFXライブラリにはImageViewというクラスが用意されており、これを利用することで画像を画面上に表示できます。このクラスは、WritableImageクラスのオブジェクトを受け取る仕組みになっています。

そのため、OpenCVのMatオブジェクトに格納された画像を表示したい場合は、まずそのMatをWritableImageオブジェクトへ変換し、それをImageViewに渡す必要があります。

MatからWritableImageへの変換手順

OpenCVのMatオブジェクトをJavaFXで扱える形式に変換するには、以下の手順を実行します。

  1. 画像の読み込み: Imgcodecs.imread()メソッドでファイルから画像を読み込み、Matオブジェクトに格納します。
  2. 画像のエンコード: Imgcodecs.imencode()メソッドを使い、MatオブジェクトをエンコードしてMatOfByteオブジェクトに格納します。
  3. バイト配列への変換: toArray()メソッドでエンコード済みのデータをバイト配列として取り出します。
  4. BufferedImageへの変換: バイト配列からByteArrayInputStreamを作成し、ImageIO.read()でBufferedImageとして読み込みます。
  5. WritableImageへの変換: SwingFXUtils.toFXImage()メソッドを使い、BufferedImageを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にシーンを追加
      stage.setScene(scene);
      // Stageの内容を表示
      stage.show();
   }

   public WritableImage loadImage() throws IOException {
      // OpenCVのコアライブラリを読み込む
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
      // ファイルから画像を読み込みMatrixオブジェクトに格納
      String file = "D:\\images\\tree.jpg";
      Mat image = Imgcodecs.imread(file);
      // 画像をエンコード
      MatOfByte matOfByte = new MatOfByte();
      Imgcodecs.imencode(".jpg", image, matOfByte);
      // エンコードしたMatをバイト配列に格納
      byte[] byteArray = matOfByte.toArray();
      // 画像の読み込みと表示
      InputStream in = new ByteArrayInputStream(byteArray);
      BufferedImage bufImage = ImageIO.read(in);
      System.out.println("Image Loaded");
      WritableImage writableImage = SwingFXUtils.toFXImage(bufImage, null);
      return writableImage;
   }

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

実行結果

上記のプログラムを実行すると、以下のような出力が得られます。指定した画像ファイルがJavaFXのウィンドウ内に表示されます。

JavaFXを使用してOpenCVのMatオブジェクトを表示する方法

なお、このコードを実行する際は、プロジェクトにOpenCVのネイティブライブラリ(Core.NATIVE_LIBRARY_NAME)が正しく設定されていることを確認してください。また、JavaFXとOpenCVの両方の依存関係がクラスパスに含まれている必要があります。

  1. JavaとOpenCVライブラリを使って画像内の顔を検出する方法

    JavaでOpenCVを使用して画像から顔を検出するには、CascadeClassifierクラスを利用します。このクラスは、分類器ファイル(カスケードファイル)を読み込み、画像内から目的のオブジェクト(ここでは顔)を検出する役割を担います。 CascadeClassifierクラスとは CascadeClassifierは、OpenCVが提供する物体検出用のクラスです。事前に学習済みのカスケード分類器(XMLファイル)を読み込むことで、顔や人など特定のパターンを画像から認識できます。 detectMultiScale()メソッドについて このクラスが持つdetectMultiScale(

  2. JavaとOpenCVライブラリを使って画像を保存(書き出し)する方法

    OpenCVライブラリを利用すると、画像フィルタリング、幾何学的変換、色空間の変換、ヒストグラム処理など、さまざまな画像処理操作を行うことができます。本記事では、その中でも基本的な操作である「画像の読み込みと保存(書き出し)」の方法を解説します。画像を書き出す(保存する)方法Imgcodecsクラスのimread()メソッドを使って画像を読み込むと、その内容はMat(Matrix)オブジェクトに格納されます。読み込んだ画像をファイルとして保存するには、imwrite()メソッドを使用します。imwrite()メソッドは、以下の2つの引数を受け取ります。file:保存先のファイルパスを表す文字列