Класс 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

Мои вопросы:

  1. Highgui вернулся в OpenCV Java Api?
  2. Как я могу отобразить изображение с помощью 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;
}
Другие вопросы по тегам