OpenCV 3.4.0 中的 Highgui class Java API
Highgui class in OpenCV 3.4.0 Java API
我正在使用 Java 学习 OpenCV,我想创建一个从文件中读取图像并将其显示在屏幕上的应用程序。我在 Whosebug 上看到几个线程说 Highgui class 不存在于 OpenCV 3.x 中,但在我的例子中看起来这个 class 已经实现。例如,我可以使用这样的命令:
Highgui.setWindowTitle("EXAMPLE01", "Testing...");
Highgui.waitKeyEx();
上面显示为空 window。但是我仍然无法在 window 中显示任何图像。当我 运行:
Highgui.imshow("EXAMPLE01", inputImage);
我收到一个错误:
Error:(28, 16) java: cannot find symbol
symbol: method imshow(java.lang.String,org.opencv.core.Mat)
location: class org.opencv.highgui.Highgui
我的问题是:
- Highgui 回到 OpenCV 了吗JavaApi?
- 如何使用 OpenCV 显示图像 Java?
我遇到了同样的问题。目前在新的 3.4(和 3.4.1)Highgui API 中没有 imshow() 方法。我找到了一个小的解决方法,这不是我们想要的,但它至少以简单的方式显示 OpenCV Mat。你可以试试:
Highgui.selectROI(Imgcodecs.imread("img.jpg"));
Highgui.waitKeyEx();
selectROI() 方法打开带有所需图像的新 JFrame window,您可以在其中 select 您感兴趣的区域,该区域在 window 关闭后返回.诀窍是您不必 select 任何投资回报率,仅将其用作图像查看器。
目前最好的方法仍然是自己制作从 Mat 到 BufferedImage 或 Image(JavaFX) 对象的转换方法,然后显示自定义 window。我目前正在为自己的项目使用以下方法。只是给你一个想法。希望对您有所帮助!
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;
}
我正在使用 Java 学习 OpenCV,我想创建一个从文件中读取图像并将其显示在屏幕上的应用程序。我在 Whosebug 上看到几个线程说 Highgui class 不存在于 OpenCV 3.x 中,但在我的例子中看起来这个 class 已经实现。例如,我可以使用这样的命令:
Highgui.setWindowTitle("EXAMPLE01", "Testing...");
Highgui.waitKeyEx();
上面显示为空 window。但是我仍然无法在 window 中显示任何图像。当我 运行:
Highgui.imshow("EXAMPLE01", inputImage);
我收到一个错误:
Error:(28, 16) java: cannot find symbol symbol: method imshow(java.lang.String,org.opencv.core.Mat) location: class org.opencv.highgui.Highgui
我的问题是:
- Highgui 回到 OpenCV 了吗JavaApi?
- 如何使用 OpenCV 显示图像 Java?
我遇到了同样的问题。目前在新的 3.4(和 3.4.1)Highgui API 中没有 imshow() 方法。我找到了一个小的解决方法,这不是我们想要的,但它至少以简单的方式显示 OpenCV Mat。你可以试试:
Highgui.selectROI(Imgcodecs.imread("img.jpg"));
Highgui.waitKeyEx();
selectROI() 方法打开带有所需图像的新 JFrame window,您可以在其中 select 您感兴趣的区域,该区域在 window 关闭后返回.诀窍是您不必 select 任何投资回报率,仅将其用作图像查看器。
目前最好的方法仍然是自己制作从 Mat 到 BufferedImage 或 Image(JavaFX) 对象的转换方法,然后显示自定义 window。我目前正在为自己的项目使用以下方法。只是给你一个想法。希望对您有所帮助!
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;
}