我想直接用JavaFX显示OpenCV中的Mat
个对象。我已经看到可以将Mat
对象转换为BufferedImage
。但据我所知,您无法使用JavaFX显示BufferedImage
,因此必须进行另一次转换。
有没有办法直接将其转换为可由JavaFX显示的数据结构?
答案 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
方法。