JavaFXを使用してOpenCVのMatオブジェクトを表示する方法
JavaFXライブラリにはImageViewというクラスが用意されており、これを利用することで画像を画面上に表示できます。このクラスは、WritableImageクラスのオブジェクトを受け取る仕組みになっています。
そのため、OpenCVのMatオブジェクトに格納された画像を表示したい場合は、まずそのMatをWritableImageオブジェクトへ変換し、それをImageViewに渡す必要があります。
MatからWritableImageへの変換手順
OpenCVのMatオブジェクトをJavaFXで扱える形式に変換するには、以下の手順を実行します。
- 画像の読み込み:
Imgcodecs.imread()メソッドでファイルから画像を読み込み、Matオブジェクトに格納します。 - 画像のエンコード:
Imgcodecs.imencode()メソッドを使い、MatオブジェクトをエンコードしてMatOfByteオブジェクトに格納します。 - バイト配列への変換:
toArray()メソッドでエンコード済みのデータをバイト配列として取り出します。 - BufferedImageへの変換: バイト配列から
ByteArrayInputStreamを作成し、ImageIO.read()でBufferedImageとして読み込みます。 - 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のウィンドウ内に表示されます。

なお、このコードを実行する際は、プロジェクトにOpenCVのネイティブライブラリ(Core.NATIVE_LIBRARY_NAME)が正しく設定されていることを確認してください。また、JavaFXとOpenCVの両方の依存関係がクラスパスに含まれている必要があります。
-
JavaとOpenCVライブラリを使って画像内の顔を検出する方法
JavaでOpenCVを使用して画像から顔を検出するには、CascadeClassifierクラスを利用します。このクラスは、分類器ファイル(カスケードファイル)を読み込み、画像内から目的のオブジェクト(ここでは顔)を検出する役割を担います。 CascadeClassifierクラスとは CascadeClassifierは、OpenCVが提供する物体検出用のクラスです。事前に学習済みのカスケード分類器(XMLファイル)を読み込むことで、顔や人など特定のパターンを画像から認識できます。 detectMultiScale()メソッドについて このクラスが持つdetectMultiScale(
-
JavaとOpenCVライブラリを使って画像を保存(書き出し)する方法
OpenCVライブラリを利用すると、画像フィルタリング、幾何学的変換、色空間の変換、ヒストグラム処理など、さまざまな画像処理操作を行うことができます。本記事では、その中でも基本的な操作である「画像の読み込みと保存(書き出し)」の方法を解説します。画像を書き出す(保存する)方法Imgcodecsクラスのimread()メソッドを使って画像を読み込むと、その内容はMat(Matrix)オブジェクトに格納されます。読み込んだ画像をファイルとして保存するには、imwrite()メソッドを使用します。imwrite()メソッドは、以下の2つの引数を受け取ります。file:保存先のファイルパスを表す文字列