Класс Highgui в OpenCV 3.4.0 Java API
Я изучаю OpenCV с использованием Java, и я хотел создать приложение, которое считывает изображение из файла и отображает его на экране. Я видел несколько потоков здесь, в Stackru, которые говорят, что класс Highgui отсутствует в OpenCV 3.x, но, похоже, в моем случае этот класс реализован. Например, я могу использовать такие команды:
Highgui.setWindowTitle("EXAMPLE01", "Testing...");
Highgui.waitKeyEx();
Выше отображается пустое окно. Однако я все еще не могу отобразить изображение в этом окне. Когда я бегу:
Highgui.imshow("EXAMPLE01", inputImage);
Я получаю ошибку:
Ошибка:(28, 16) Java: не удается найти символ символа: метод imshow(java.lang.String,org.opencv.core.Mat) расположение: класс org.opencv.highgui.Highgui
Мои вопросы:
- Highgui вернулся в OpenCV Java Api?
- Как я могу отобразить изображение с помощью OpenCV Java?
1 ответ
Я столкнулся с той же проблемой. В настоящее время в новом API Highgui 3.4 (и 3.4.1) нет метода 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;
}