Java-программирование, opencv неудовлетворенная ошибка связи

Исключение в потоке "main" java.lang.UnsatisfiedLinkError: нет opencv_java320 в java.library.path

at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at opencv.VideoCap.main(VideoCap.java:9)

код, где генерировать эту ошибку

пакет opencv;

import org.opencv.core. *;

import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;
открытый класс VideoCap {

public static void main (String args[]){

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // error

    VideoCapture camera = new VideoCapture(0);

    if(!camera.isOpened()){
        System.out.println("Error");
    }
else {
        Mat frame = new Mat();
        while(true){
            if (camera.read(frame)){
                System.out.println("Frame Obtained");
                System.out.println("Captured Frame Width " + 
                frame.width() + " Height " + frame.height());
                Imgcodecs.imwrite("camera.jpg", frame);
                System.out.println("OK");
                break;
            }
        }   
    }
    camera.release();
}}    

0 ответов

Следующая картинка - мое содержимое каталога, в котором opencv 4.0.1 установлен с библиотекой tesseract. Я построил его с помощью компилятора gcc mingw32 на Windows на самом деле 10.

Я думаю, что у вас есть как минимум два файла opencv_javaXXX_dll и opencv-XXX.jar.

Я собрал библиотеку opencv с компилятором gcc mingw32 в Windows 10 Итак, я должен установить каталог bin, где установлен mingw32 и java.

Я устанавливаю переменные в окне cmd,

SET MINGW_HOME=D:/DEV/SDK/msys32/mingw32
SET JAVA_HOME=D:/DEV/SDK/JDK/jdk1.8.0_152
SET PATH=%MINGW_HOME%/bin;%JAVA_HOME%/bin

Вот мои тестовые команды.

C:\Windows\System32\cmd.exe /C "javac -cp .;opencv-410.jar -d . *.java & java -Djava.library.path=. -cp .;opencv-410.jar VideoCap"

Есть три возможных случая.

1. Не удается найти зависимую библиотеку.

Эта проблема указывает на то, что у вас отсутствуют некоторые библиотеки.

В этом случае я должен получить это сообщение, если у меня нет libtesseract40.dll в том же каталоге или системном пути.

2. Неудовлетворительная ошибка связи с именем библиотеки.

Обычно это происходит, когда имя библиотеки не совпадает. Я получу ошибку, если у меня есть libopencv_java410.dll в качестве имени библиотеки.

3. Неудовлетворительная ошибка связи с именем метода.

Если у вас есть еще одна неудовлетворенная ссылка - имя метода.

Например,

java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_eye (III) J

Я думаю это усложнит проблему.

Возможно, ваша библиотека будет скомпилирована и собрана с нуля.

В ОС Windows мне пришлось добавить флаг сборки на следующей строке в CMakefile.txt.

Я добавил флаг '--add-stdcall-alias'.

Расположение файла CMakefile.txt:

[~ opencv-4.1.0 исходный каталог]\modules\java\jni\CMakefile.txt

  elseif(((CV_GCC OR CV_CLANG OR UNIX) OR (OPENCV_FORCE_FAT_JAVA_LIB_LD_RULES)) AND (NOT OPENCV_SKIP_FAT_JAVA_LIB_LD_RULES))
    ocv_target_link_libraries(${the_module} LINK_PRIVATE -Wl,-whole-archive ${__deps} -Wl,-no-whole-archive -Wl,--add-stdcall-alias)

Полный код теста выглядит следующим образом:

//A test code for the opencv 4.0.1 
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;

public class HelloCV {

    public static void test1(){
       System.load(new java.io.File(".").getAbsolutePath() + java.io.File.separator + "opencv_java410.dll");

        VideoCapture camera = new VideoCapture(0);


        if(!camera.isOpened()){
            System.out.println("Error");
        }
        else {
            Mat frame = new Mat();
            while(true){
                if (camera.read(frame)){
                    System.out.println("Frame Obtained");
                    System.out.println("Captured Frame Width " + 
                    frame.width() + " Height " + frame.height());
                    Imgcodecs.imwrite("camera.jpg", frame);
                    System.out.println("OK");
                    break;
                }
            }   
        }
        camera.release();
    }

    public static void test2(){
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // error

        VideoCapture camera = new VideoCapture(0);


        if(!camera.isOpened()){
            System.out.println("Error");
        }
        else {
            Mat frame = new Mat();
            while(true){
                if (camera.read(frame)){
                    System.out.println("Frame Obtained");
                    System.out.println("Captured Frame Width " + 
                    frame.width() + " Height " + frame.height());
                    Imgcodecs.imwrite("camera.jpg", frame);
                    System.out.println("OK");
                    break;
                }
            }   
        }
        camera.release();
    }   

    public static void main (String args[]){
        test1();
        test2();
    }
}

Попробуйте клонировать репозиторий ниже:

https://github.com/hellonico/opencv4_java_tutorial.git

Добавьте свой класс в папку java и вместо System.loadLibrary ... используйте:

NativeLoader.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Это загрузит правильно скомпилированную версию OpenCV для запуска в JVM.

Другие вопросы по тегам