使用 JavaFX 显示 OpenCV Mat

Display OpenCV Mat with JavaFX

我想使用 JavaFX 直接显示来自 OpenCV 的 Mat 个对象。我看到可以将 Mat 对象转换为 BufferedImage。但据我所知,您无法使用 JavaFX 显示 BufferedImage,因此必须进行另一次转换。

有没有办法直接将其转换为JavaFX可显示的数据结构?

愚蠢的做法是将 Mat 转换为 BufferedImage,然后将其转换为 Image,以便它可以显示在 [=15= 中]:

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

我还没有测试代码,但这是一般的想法。

我找到了将 Mat 对象转换为 JavaFX Image 对象的直接方法。

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

您也可以将其编码为 .jpg,但 .bmp 更快。

TomTom 的回答非常有帮助并解决了问题,但是 Highgui 在 java 中不再有任何绑定。

从 OpenCV 3.0.0 开始,最新代码更像是:

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

不需要编码和解码来得到你需要的字节数组,你可以只声明一个数组并使用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)

此代码声明类型为 byte[] 的数组 arr,其大小对应于 w 和 3 个通道的 h 图像。然后将数据从mat对象复制到数组中,并从PixelWriter对象pw.

传递给setPixels方法