2017-02-12 20 views
1

При создании нового экземпляра Mat в OpenCV 3.2 программа выдает UnsatisfiedLinkError. Это происходит как при вызове Mat конструктор непосредственно, а также при вызове Imgcodecs.imread, который, в свою очередь, выдает ошибку на следующей строке:Почему OpenCV бросает UnsatisfiedLinkError при использовании Mat?

Mat mats_mat = Converters.vector_Mat_to_Mat(mats); 

Программа бежится на Mac установлена ​​последняя версия MacOS Sierra (10.12.3), и все доступные файлы dylib находятся в каталоге java.library.path. Подтвержденный файл подтвержден. Трассировки стека считывает (частично) следующим образом:

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.opencv.imgcodecs.Imgcodecs.imread_1(Ljava/lang/String;)J 
    at org.opencv.imgcodecs.Imgcodecs.imread_1(Native Method) 
    at org.opencv.imgcodecs.Imgcodecs.imread(Imgcodecs.java:118) 

В dylib файлы загружаются с помощью следующего кода в main без ошибок и предупреждений:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
System.loadLibrary("opencv_imgproc.3.2.0"); 
System.loadLibrary("opencv_imgcodecs.3.2"); 
System.loadLibrary("opencv_videoio.3.2"); 
System.loadLibrary("opencv_highgui.3.2.0"); 
System.loadLibrary("opencv_flann.3.2"); 
System.loadLibrary("opencv_ml.3.2"); 
System.loadLibrary("opencv_features2d.3.2"); 
System.loadLibrary("opencv_calib3d.3.2"); 
System.loadLibrary("opencv_objdetect.3.2"); 
System.loadLibrary("opencv_photo.3.2"); 
System.loadLibrary("opencv_stitching.3.2"); 
System.loadLibrary("opencv_video.3.2.0"); 
System.loadLibrary("opencv_superres.3.2"); 
System.loadLibrary("opencv_shape.3.2"); 
System.loadLibrary("opencv_videostab.3.2"); 

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

this(Imgcodecs.imread(filePath)); 

Mat mat = new Mat(); 

MatOfPoint matOfPoint = new MatOfPoint(); 

ответ

0

Печать из Core.NATIVE_LIBRARY_NAME на моей машине (Ubuntu 16,04 ж/OpenCV 3.2 с Java и Python портов) дает мне это:

opencv_java320 

Мне кажется, что System.load требует полного пути, тогда как Core.NATIVE_LIBRARY_NAME только дает частичное имя, даже не включая расширение! OpenCV Java имеет свой путь двоичных файлов по умолчанию, расположенный по адресу /usr/local/share/OpenCV/java. (По крайней мере, для меня или людей, которые использовали настройки по умолчанию при компиляции), вы можете найти библиотеку libopencv_java320.so, которая является фактической, правильной родной библиотекой, к которой вам нужно установить ссылку!