Подключение OpenCV к проекту Java

101
19 июня 2021, 00:10

При выполнении кода из туториала:

static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }
    public static void main(String[] args) {
        System.out.println("Welcome to OpenCV " + Core.VERSION);
        Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
        System.out.println("OpenCV Mat: " + m);
        Mat mr1 = m.row(1);
        mr1.setTo(new Scalar(1));
        Mat mc5 = m.col(5);
        mc5.setTo(new Scalar(5));
        System.out.println("OpenCV Mat data:\n" + m.dump());
    }

При запуске данного кода получаю ошибку:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java410 in java.library.path:

Кроме всего прочего, установил OpenCV последней версии для Windovs, в системной переменной среды Path прописал путь к этой папке по мануалу одной из статей на хабре:

C:\Java_Projects\opencv\build\x64\vc15\bin

Пролистал ответы(1, 2) на данную ошибку, но решения не нашел.

Вопроса два:

1) Почему он пытается найти версию файла 410, если у меня стоит openCV, в котором версия данного файла 411. (Может быть из-за зависимости в pom, но там прописана самая свежая)

2) Необходимо ли в переменой PAth (или где в другом месте) прописывать путь до файла с версией 411, т.к. он лежит в папке: C:\Java_Projects\opencv\build\java\x64 ?

P.S. На второй вопрос понимаю, что необходимо, но хочу услышать правильный ответ на вопрос, где.

pom.xml:

<dependency>
  <groupId>org.bytedeco</groupId>
  <artifactId>javacv-platform</artifactId>
  <version>1.5.1</version>
</dependency>

UPD:

Core.NATIVE_LIBRARY_NAME

Возвращает как раз opencv_java410, но тогда не совсем ясно, что делать. Загружать системную библиотеку по имени *411, или же ставить OpenCV более старой версии, в которой есть 410 версия?

Answer 1

Решение, которое сработало, но я не до конца уверен, что оно верное, это в параметрах запуска прописать путь до 411 библиотеки:

-Djava.library.path="C:\Java_Projects\opencv\build\java\x64"

В этой папке переименовать 411 библиотеку в 410, которую ищет. Тогда код запускается и работает, но я не думаю - что это верный вариант. Хотелось бы узнать правильный ответ.

READ ALSO
Ошибка: java: not a statement

Ошибка: java: not a statement

На выводе получаю ошибку:

110
Интересный случай с конкатенацией

Интересный случай с конкатенацией

Почему "sconcat(s)" в отдельности не работает а вот при присваивании к новой String или сразу в sout - работает? Я знаю что String это Immutable класс, и по идее...

83
Программное создание класса

Программное создание класса

Каким образом можно программно создать новый java класс? И можно ли вообще?

88
Почему я могу присвоить массив объекту?

Почему я могу присвоить массив объекту?

Почему в строке с комментарием не дает ошибку компиляции? Пробовал с другими ссылочными типами - там все нормально, ошибка компиляции, а в случае...

96