OpenCV 3.4.0 Java API中的Highgui类

问题描述 投票:0回答:1

我正在使用Java学习OpenCV,我想创建一个从文件中读取图像并将其显示在屏幕上的应用程序。我在Stackoverflow上看到了很少的线程,说OpenCV 3.x中没有Highgui类,但在我的情况下看起来这个类已经实现了。例如,我可以使用这样的命令:

Highgui.setWindowTitle("EXAMPLE01", "Testing...");
Highgui.waitKeyEx();

上方显示空窗口。但是我仍然无法在此窗口中显示任何图像。当我跑:

Highgui.imshow("EXAMPLE01", inputImage);

我收到一个错误:

错误:(28,16)java:找不到符号符号:方法imshow(java.lang.String,org.opencv.core.Mat)location:class org.opencv.highgui.Highgui

我的问题是:

  1. Highgui回到了OpenCV Java Api吗?
  2. 如何使用OpenCV Java显示图像?
java image opencv highgui
1个回答
0
投票

我面临同样的问题。目前在新的3.4(和3.4.1)Highgui API中没有imshow()方法。我找到了一个小的解决方法,这不是我们想要的,但它至少以简单的方式显示OpenCV Mat。你可以尝试:

Highgui.selectROI(Imgcodecs.imread("img.jpg"));
Highgui.waitKeyEx();

selectROI()方法打开具有所需图像的新JFrame窗口,您可以在其中选择您关注的区域,该区域在窗口关闭后返回。诀窍是您不必选择任何ROI并仅将其用作图像查看器。

目前最好的方法仍然是制作自己的转换方法,从Mat到BufferedImage或Image(JavaFX)对象,然后显示自定义窗口。我目前正在使用下面的方法来完成我自己的项目。只是为了给你一个主意。希望能帮助到你!

public static BufferedImage convertMatToBufferedImage(Mat m){
    byte [] buffer = new byte[m.channels()*m.cols()*m.rows()];
    m.get(0, 0, buffer); 
    BufferedImage image = new BufferedImage(m.cols(), m.rows(), BufferedImage.TYPE_BYTE_GRAY);
    final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
    System.arraycopy(buffer, 0, targetPixels, 0, buffer.length);     
    return image;
}

public static Image convertMatToImage(Mat m) {
    if (m == null || m.width() == 0 || m.height() == 0) return null;
    Mat resultMat = m.clone();
    WritableImage image = new WritableImage(m.width(), m.height());
    byte[] data = new byte[m.cols() * m.rows() * 3]; // * 3 because Image needs 3 bytes per pixel even if grayscale

    if (resultMat.channels() == 1)
        Imgproc.cvtColor(resultMat, resultMat, Imgproc.COLOR_GRAY2RGB);
    else if (resultMat.channels() == 3)
        Imgproc.cvtColor(resultMat, resultMat, Imgproc.COLOR_BGR2RGB);

    resultMat.get(0, 0, data);
    image.getPixelWriter().setPixels(0, 0, m.width(), m.height(), PixelFormat.getByteRgbInstance(), data, 0, m.width() * 3);
    return image;
}
© www.soinside.com 2019 - 2024. All rights reserved.