在OpenCV 3.2中构造新的Mat实例时,程序将抛出UnsatisfiedLinkError。直接调用Mat构造函数时以及调用Imgcodecs.imread时都会发生这种情况,这又在以下行中引发错误:

Mat mats_mat = Converters.vector_Mat_to_Mat(mats);

该程序正在运行最新版本的macOS Sierra(10.12.3)的Mac上运行,并且所有可用的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();

最佳答案

在我的机器上打印出Core.NATIVE_LIBRARY_NAME(带有Java和Python端口的Ubuntu 16.04 w /带有OpenCV 3.2的)可以为我提供以下信息:

opencv_java320

在我看来,System.load需要完整的路径,而Core.NATIVE_LIBRARY_NAME仅给出部分名称,甚至不包括扩展名! OpenCV Java的默认二进制文件路径位于/usr/local/share/OpenCV/java。 (至少对于我或在编译时使用默认设置的用户而言),您可以在其中找到libopencv_java320.so库,它是您需要链接的实际,正确的本机库!

关于java - 为什么使用Mat时OpenCV会引发UnsatisfiedLinkError?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42192363/

10-09 09:22