【问题标题】:Java programming, opencv unsatisfied link errorJava编程,opencv unsatisfied link错误
【发布时间】:2018-03-30 21:03:01
【问题描述】:

OpenCV 库在捕获视频流时出现不满意的链接错误。

opencv 3.2.0 库应该在哪里? opencv 类包的正确路径是什么?

产生此错误的代码:

package opencv;

import org.opencv.core.*; 

import org.opencv.imgcodecs.Imgcodecs;        
import org.opencv.videoio.VideoCapture;     
public class 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();
    }
}

例外是:

Exception in thread "main" java.lang.UnsatisfiedLinkError:
    no opencv_java320 in 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)

【问题讨论】:

  • 我已按照设置教程中的所有说明进行操作,但仍然无法正常工作。有谁知道这可能是什么问题?
  • 可以加一些代码看看吗?仅显示错误消息仅说明问题的结果,而不是问题本身。
  • jacob bro 现在检查代码并告诉我错误
  • 我认为发生的事情是您的代码找不到库,可能是因为您没有正确设置路径变量。尝试System.load() 并指定完整路径。

标签: java opencv3.0 java.library.path


【解决方案1】:

尝试克隆下面的存储库:

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

在 java 文件夹中添加你的类,而不是使用 System.loadLibrary ... 使用:

NativeLoader.loadLibrary(Core.NATIVE_LIBRARY_NAME);

这将加载正确编译的 OpenCV 版本以在 JVM 中运行。

【讨论】:

    【解决方案2】:

    下图是我的一个目录的内容,其中opencv 4.0.1 安装了一个tesseract 库。我在 Windows 10 上使用 mingw32 gcc 编译器构建了它。

    我认为你至少有两个文件 opencv_javaXXX_dllopencv-XXX.jar

    我在 Windows 10 上使用 mingw32 gcc 编译器构建了 opencv 库 所以,我必须设置安装mingw32和java的bin目录。

    我在 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      相关资源
      最近更新 更多