2015-01-03 21 views
6

OpenCVのMatオブジェクトをJavaFXで直接表示したいとします。 MatオブジェクトをBufferedImageに変換することが可能であることがわかりました。しかし、あなたが知っている限り、BufferedImageをJavaFXで表示することはできないので、別の変換が行われなければなりません。JavaFXでOpenCV Matを表示

に直接をJavaFXで表示可能なデータ構造に変換する方法はありますか?

これを行うには愚かな方法が BufferedImageMatを変換することです
+0

'WritableImage'を使ってFXに直接変換することはおそらく可能です。 'Mat'から' WritableImage'の 'PixelWriter'にピクセルをコピーするか、' Mat'によって裏打ちされた 'PixelReader'を実装することによって、' WritableImage'を直接インスタンス化するために使用します。 – haraldK

答えて

6

MatオブジェクトをJavaFX Imageオブジェクトに直接変換する方法を発見しました。

MatOfByte byteMat = new MatOfByte(); 
Highgui.imencode(".bmp", mat, byteMat); 
return new Image(new ByteArrayInputStream(byteMat.toArray())); 

また、.jpgにエンコードすることもできますが、.bmpは高速です。

+0

OpenCVにHighGUIライブラリ/クラスが付属していないのはなぜですか? –

+1

代わりに "Imgcodecs.imencode"を使用しました。 –

2

、及びそのImageにそれがImageView内に表示することができるように:

あなたが第一を行う方法を知っていると仮定すると、
Mat >> BufferedImage >> Image >> ImageView 

残りは次のようなものになります。

import javafx.embed.swing.SwingFXUtils; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 

Image image = SwingFXUtils.toFXImage(bufImage, null); 

ImageView imgView = new ImageView(); 
imgView.setImage(image); 

私はコードをテストしていませんが、それは一般的な考えです。

2

TomTomの回答は非常に役に立ち、問題は解決しましたが、Highguiはjavaにバインディングをもはや持っていません。 OpenCVの3.0.0のよう

、最新のコードはもっと似ている:あなたが必要とするバイト配列を取得するために

MatOfByte byteMat = new MatOfByte(); 
Imgcodecs.imencode(".bmp", mat, byteMat); 
return new Image(new ByteArrayInputStream(byteMat.toArray())); 
+0

あなたの答えはOpenCVバージョン3の解決策です。以前のバージョンではHighguiを使用しています。 – Roland

+0

あなたの精度をありがとう、私はちょうど編集し、私の答えを修正しました。 – deb0ch

0

代わりのエンコードおよびデコード、あなただけのアレイとの使用を宣言することができます方法はgetです。これはScalaのコードであるが、できればそれが分かります:

val arr = new Array[Byte](w * h * 3) 
mat.get(0, 0, arr) 
pw.setPixels(0, 0, w, h, PixelFormat.getByteRgbInstance, arr, 0, w * 3) 

このコードはwによってhと3チャンネルの画像に対応するサイズとタイプbyte[]の配列arrを宣言する。次に、データはmatオブジェクトから配列にコピーされ、PixelWriterオブジェクトpwからsetPixelsメソッドに渡されます。

関連する問題