gpt4 book ai didi

java - 如何在 Windows 上的 Java 中使用 OpenCV 4.4.0(带有 contrib 模块)?

转载 作者:行者123 更新时间:2023-12-02 16:51:00 30 4
gpt4 key购买 nike

我已经在 Windows 64 位上从源代码编译了 OpenCV 4.4.0 以及 java 绑定(bind),我正在尝试编译一个基本测试,但是我遇到了意外错误。
以下是我设置 Eclipse 项目的方式:
Eclipse project displaying OpenCV java and native library files
这就是 jar 引用 native 库的方式:
Java project build properties of the OpenCV java library pointing to native DLLs
这是基本的测试片段:

import org.opencv.core.*;

public class CVTest {

public static void main(String[] args) {
System.load(Core.NATIVE_LIBRARY_NAME);

}

}
引发此异常:
     Exception in thread "main" java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library: opencv_java440
at java.lang.Runtime.load0(Runtime.java:806)
at java.lang.System.load(System.java:1086)
at CVTest.main(CVTest.java:8)
我尝试将绝对路径硬编码为测试:
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_java440.dll");
但是我遇到了这个异常:
线程“主”java.lang.UnsatisfiedLinkError 中的异常:
C:\Users\george.profenza\Documents\eclipse\CVTest\lib\opencv_java440.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at CVTest.main(CVTest.java:9)


我没想到会这样,因为我编译了 OpenCV 4 64 位并且我在 JVM 1.8 64 位上运行它。
我尝试一次手动加载一个库并使用 Dependency Walker最后设法实例化一个 Mat像这样:
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_core440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_imgproc440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_imgcodecs440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_img_hash440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_videoio_ffmpeg440_64.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_videoio440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_photo440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_xphoto440.dll");

System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_flann440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_features2d440.dll");

System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_calib3d440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_phase_unwrapping440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_structured_light440.dll");

System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_xfeatures2d440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_video440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_ximgproc440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_aruco440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_bgsegm440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_bioinspired440.dll");

System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_objdetect440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_face440.dll");

System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_dnn440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_tracking440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_plot440.dll");

System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_ml440.dll");
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_text440.dll");


// f.finally load the JNI wrapper native lib
System.load("C:\\Users\\george.profenza\\Documents\\eclipse\\CVTest\\lib\\opencv_java440.dll");
这可行,但按该顺序对每个 DLL 进行硬编码感觉就像是一个困惑的 hack。
有没有其他人遇到过这种情况?
在 Windows 上用 Java 加载 OpenCV 4 库的优雅方式是什么?
为了方便测试,我上传了以下内容:
  • opencv_440_windows32.zip : 32 位头文件/动态库(以及 java 包装器)
  • opencv_440_windows64.zip : 64 位头文件/动态库(以及 java 包装器)

  • 更新
    以下是静态库,包括基于 José 出色答案的 java 绑定(bind):
  • opencv_440_static_windows32.zip
  • opencv_440_static_windows64.zip
  • 最佳答案

    尝试预编译的库应该更容易。

    <!-- https://mvnrepository.com/artifact/org.openpnp/opencv -->
    <dependency>
    <groupId>org.openpnp</groupId>
    <artifactId>opencv</artifactId>
    <version>4.3.0-2</version>
    </dependency>
    几年前我尝试过这个库,它可以工作。

    关于java - 如何在 Windows 上的 Java 中使用 OpenCV 4.4.0(带有 contrib 模块)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62503875/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com