Дисплей OpenCV мат с JavaFX

Я хотел бы показать Mat объекты из OpenCV напрямую с JavaFX. Я видел, что можно преобразовать a Mat объект в BufferedImage. Но насколько я знаю, вы не можете отобразить BufferedImage С JavaFX, поэтому должно произойти другое преобразование.

есть ли способ напрямую преобразовать его в структуру данных, которая отображается JavaFX?

4 ответов


Я нашел прямой способ конвертировать Mat объект для JavaFX


ответ TomTom был очень полезен и решил проблему, но Highgui больше не имеет Привязок в java.

начиная с OpenCV 3.0.0, обновленный код больше похож на:

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

глупый способ сделать это, чтобы преобразовать Mat до BufferedImage, а потом что доImage так, что его можно показать внутри ImageView:

Mat >> BufferedImage >> Image >> ImageView

предполагая, что вы знаете, как сделать 1-е преобразование, остальное будет примерно так:

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);

Я не проверял код, но это общая идея.


вместо кодирования и декодирования, чтобы получить байтовый массив, вы можете просто объявить массив и использовать 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)

этот код объявляет массив arr типа byte[] С размером, соответствующим изображению h by w и 3 каналы. Затем данные копируются из mat объект в массив, и передан setPixels метод PixelWriter объект pw.