OpenCVのMatオブジェクトをJavaFXのWritableImageに変換する方法
OpenCVのimread()メソッドを使って画像を読み込むと、戻り値としてMatオブジェクトが返されます。しかし、このMatオブジェクトの中身をJavaFXのウィンドウ上に表示したい場合、そのままでは扱えないため、javafx.scene.image.WritableImageクラスのオブジェクトへ変換する必要があります。
ここでは、MatオブジェクトからWritableImageへの変換手順を、順を追って解説します。
変換の基本手順
MatをMatOfByteにエンコードする:まず、画像データ(行列)をバイトデータの行列に変換します。これには、Imgcodecsクラスのimencode()メソッドを使用します。
このメソッドは、画像フォーマットを指定するString型の引数、画像を表すMatオブジェクト、そして結果を受け取るMatOfByteオブジェクトの3つを引数として受け取ります。
MatOfByteオブジェクトをバイト配列に変換する:toArray()メソッドを呼び出すことで、MatOfByteオブジェクトをbyte型の配列へ変換できます。
ByteArrayInputStreamをインスタンス化する:前の手順で作成したバイト配列をコンストラクタに渡して、ByteArrayInputStreamクラスのインスタンスを生成します。
BufferedImageオブジェクトを作成する:生成したInputStreamオブジェクトを、ImageIOクラスのread()メソッドに渡します。これによりBufferedImageオブジェクトが取得できます。
最後に、得られたBufferedImageオブジェクトを引数として、SwingFXUtilsクラスのtoFXImage()メソッドを呼び出します。戻り値としてWritableImageオブジェクトが返されます。
サンプルコード
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.imgcodecs.Imgcodecs;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.image.WritableImage;
public class Mat2WritableImage {
public static WritableImage Mat2WritableImage(Mat mat) throws IOException{
// 画像のエンコード
MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".jpg", mat, matOfByte);
// エンコードしたMatをバイト配列に格納
byte[] byteArray = matOfByte.toArray();
// BufferedImageの準備
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[]) throws Exception {
// OpenCVコアライブラリのロード
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
// ファイルから画像を読み込む
String file = "C:/EXAMPLES/OpenCV/sample.jpg";
Mat image = Imgcodecs.imread(file);
WritableImage obj = Mat2WritableImage(image);
System.out.println(obj);
}
}実行結果
Image Loaded javafx.scene.image.WritableImage@142269f2
このように、エンコード→バイト配列化→ストリーム化→BufferedImage→WritableImageという流れで変換を行うことで、OpenCVで読み込んだ画像をJavaFXアプリケーション上に簡単に表示できるようになります。
-
JavaのOpenCVライブラリでカラー画像をグレースケールに変換する方法
カラー画像をグレースケールに変換する基本OpenCVのImgprocクラスが提供するcvtColor()メソッドを使うと、画像の色空間を別の色空間へ変換できます。このメソッドは以下の3つのパラメータを受け取ります。src – 変換元の画像を表すMatオブジェクト(ソース)dst – 変換結果を格納するMatオブジェクト(出力先)code – 変換後の色空間を指定する整数値(カラーコード)カラー画像をグレースケールに変換する場合は、第3パラメータにImgproc.COLOR_RGB2GRAYを指定します。このコードはRGB形式の画像をグレースケール(白黒の濃淡表現)へ変換することを意味しています
-
画像をPyTorchテンソルに変換する方法【PIL・OpenCV対応の実装例つき】
PyTorchのテンソル(Tensor)とは、単一のデータ型で構成されたn次元配列(行列)のことです。NumPy配列とよく似ていますが、最大の違いは、テンソルがGPUを活用して数値計算を高速化できるという点にあります。そのため、画像を使った深層学習では、まず画像をテンソル形式へ変換することが一般的な前処理となります。 この記事では、画像をPyTorchテンソルに変換する具体的な手順を、PIL画像を使う例とOpenCV(numpy.ndarray)を使う例の2パターンでわかりやすく解説します。 画像をPyTorchテンソルに変換する手順 必要なライブラリをインポートする:torch、torch