如何将mat(OpenCV)转换为图像(JavaFX)?

时间:2015-03-18 11:29:34

标签: java opencv javafx

如何将mat(OpenCV)转换为图像(JavaFX)? 我认为这不是最好的方法:

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

P.S。

Image - import javafx.scene.image.Image;

2 个答案:

答案 0 :(得分:0)

这样做的一种方法是。我不记得我从哪里得到这个来源: -

private Image mat2Image(Mat frame)
{
    int type = BufferedImage.TYPE_BYTE_GRAY;
    if ( frame.channels() > 1 ) {
        type = BufferedImage.TYPE_3BYTE_BGR;
    }
    int bufferSize = frame.channels()*frame.cols()*frame.rows();
    byte [] b = new byte[bufferSize];
    frame.get(0,0,b); // get all the pixels
    BufferedImage image = new BufferedImage(frame.cols(),frame.rows(), type);
    final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
    System.arraycopy(b, 0, targetPixels, 0, b.length);
    return SwingFXUtils.toFXImage(image,null);

}

使用Opencv中的Converters类和JDK8可能有一种方法可以使它更整洁。如果我发现任何此类事情,我会更新。

答案 1 :(得分:0)

Paritosh,你的方法的问题是它只适用于类型为import java.util.Scanner; public class Q2 { public static void main(String args []) { Scanner keyboardIn = new Scanner(System.in); String Fname; String Lname; System.out.print("Please enter first name: "); Fname=keyboardIn.nextLine(); System.out.print("Please enter last name: "); Lname=keyboardIn.nextLine(); if(Fname.compareTo(Lname) < 0) { System.out.println(Lname + " Is longest "); } else if(Fname.compareTo(Lname) > 0) { System.out.println(Fname + " Is longest "); } } } CvType.CV_8U的Mats,因为这些Mats可以包含在字节数组中。如果Mat的类型是,CvType.CV_8S,那么你需要一个float数组来保存数据。 float数组不能被System.array复制到CvType.CV_32F数组中。