【问题标题】:Is there a way to set up dependency for javacv's native part in maven, without manual installation and setting up java.library.path?有没有办法在 Maven 中为 javacv 的本机部分设置依赖项,而无需手动安装和设置 java.library.path?
【发布时间】:2020-04-21 18:37:01
【问题描述】:

我对@9​​87654324@ 有依赖关系,而org.bytedeco:opencv:4.1.2-1.5.2 又由

添加到项目中
        <groupId>org.datavec</groupId>
        <artifactId>datavec-data-image</artifactId>
        <version>${datavec.version}</version>

并且为了datavec-data-image的需要,open-cv加载良好,所有内部open-cv动作都被执行。

然后,我想明确地执行一些开放式 cv 执行。我使用来自https://github.com/rostrovsky/pdf-table 的一个类来做这些事情:

public class PdfTableReader {

    private TableExtractor extractor;
    private PdfTableSettings settings;

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

它失败了

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java412 in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at pdftable.PdfTableReader.<clinit>(PdfTableReader.java:32)
    at pdftable.ExtractSyzlekFromPdf.main(ExtractSyzlekFromPdf.java:12)

我应该怎么做才能使这个明确的javacv 部分与datavec 图像代码一起使用,而不在我的电脑上的某个位置进行双重明确的open-cv 安装并明确设置java.library.path?至少datavec 图像代码在没有这种显式设置的情况下以某种方式获得它。

我也尝试跟进这个答案:https://stackoverflow.com/a/57515132/1759063 但没有成功(如果我理解正确,他们使用以跨平台方式提供本机库的依赖项,即提供所有平台二进制文件,而需要的是在正确的平台上使用)。如果打包到 maven 依赖项的 open-cv 本机二进制文件附加到项目,我想应该有一种方法可以使 java.library.path 动态更新。但是怎么做呢?

如果 DL4J 的人可以解释如何正确使用那里的 javacv 部分,那就完美了。

【问题讨论】:

  • 你给Loader.load(opencv_java.class)打过电话吗? github.com/bytedeco/javacpp-presets/tree/master/…
  • @SamuelAudet 不,我使用了System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Loader 的完整类名是什么?它来自什么库/依赖项?
  • @SamuelAudet 抱歉,错过了您附加的链接,知道了,让我检查一下
  • @SamuelAudet 是的,这有帮助。请发表您的评论作为官方答案。 DL4J 代码中没有明确调用此行,可能是因为它在引擎盖下的某处被调用。并且恰好在 System.loadLibrary(Core.NATIVE_LIBRARY_NAME) 双重调用的位置使用此 Loader.load(opencv_java.class) 的双重调用导致如下异常:java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724)

标签: java opencv javacv deeplearning4j dl4j


【解决方案1】:

org.opencv 包中的 OpenCV 的 Java API 没有附带加载器,因此库需要由其他外部加载。对于 OpenCV 的 JavaCPP 预设,库和包装器都捆绑在 JAR 文件中,我们可以调用 Loader.load(opencv_java.class) 来加载此处记录的所有内容:
https://github.com/bytedeco/javacpp-presets/tree/master/opencv#documentation

JavaCV、Deeplearning4j 和 DataVec 不使用 OpenCV 的 Java API,它们使用 org.bytedeco.opencv 包中的 API,它会自动加载所有内容,因此它们不需要调用任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多