Дисплей OpenCV мат с JavaFX
Я хотел бы показать Mat
объекты из OpenCV напрямую с JavaFX. Я видел, что можно преобразовать a Mat
объект в BufferedImage
. Но насколько я знаю, вы не можете отобразить BufferedImage
С JavaFX, поэтому должно произойти другое преобразование.
есть ли способ напрямую преобразовать его в структуру данных, которая отображается JavaFX?
4 ответов
ответ 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
.