使用JavaFX显示OpenCV Mat

时间:2015-01-03 13:04:57

标签: java image opencv javafx mat

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

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

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

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

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

<input type="checkbox" id="ck" onClick="if(ck==1)unChecked();else doChecked();">


ck=0; //init checkbox is unchecked
function doChecked(){    
document.getElementById("ck").checked="checked";
document.getElementById("ck").checked=true;
ck=1;
}
function unChecked(){    
document.getElementById("ck").checked="";
document.getElementById("ck").checked=false;
ck=0;
}

答案 2 :(得分:2)

执行此操作的愚蠢方法是将Mat转换为BufferedImage,然后将其转换为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);

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

答案 3 :(得分: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)

此代码声明arr类型的数组byte[],其大小对应h w和{3}通道的图像。然后将数据从mat对象复制到数组中,并从setPixels对象PixelWriter传递给pw方法。