【问题标题】:Java OpenCV from Maven来自 Maven 的 Java OpenCV
【发布时间】:2016-10-20 11:14:43
【问题描述】:

有没有办法从存储库中获取 OpenCV?我应该将哪个工件添加到pom.xml?我发现的每个教程都来自 14 年,似乎有些改变了——他们说它还没有在官方 Maven 存储库中,但我找到了条目:

<!-- https://mvnrepository.com/artifact/nu.pattern/opencv -->
<dependency>
   <groupId>nu.pattern</groupId>
   <artifactId>opencv</artifactId>
   <version>2.4.9-7</version>
</dependency>

很遗憾,我得到了错误

Caused by: java.lang.UnsatisfiedLinkError: no opencv_java249 in java.library.path

当我使用System.loadLibrary(Core.NATIVE_LIBRARY_NAME) 时。我能否以一种使我的项目包含它并“忘记”手动将其添加到类路径的方式添加这个库?

【问题讨论】:

  • 这看起来不像是正式版本.. 看看github.com/Itseez/opencv/issues/4588
  • 哦,我希望使用 Maven 会更容易。那你能告诉我,如何将这个库添加到 WildFly 中?

标签: java maven opencv


【解决方案1】:

在您的 POM 文件中添加以下依赖项:

<dependency>
    <groupId>org.openpnp</groupId>
    <artifactId>opencv</artifactId>
    <version>3.2.0-0</version>
</dependency>

并替换以下行:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME)

nu.pattern.OpenCV.loadShared();

这应该也可以解决 WINDOWS 中的问题。快乐编码。

【讨论】:

【解决方案2】:

这对我有用。

nu.pattern.OpenCV.loadLibrary();

我正在使用以下 maven 依赖项

<dependency>
  <groupId>nu.pattern</groupId>
  <artifactId>opencv</artifactId>
  <version>2.4.9-4</version>
</dependency>

【讨论】:

  • 这对我有用。只需将 System.loadLibrary(Core.NATIVE_LIBRARY_NAME) 替换为 OpenCV.loadLibrary();
  • 我收到此错误“操作系统“WINDOWS”和体系结构“X86_64”不受支持。在 nu.pattern.OpenCV.loadLibrary(OpenCV.java:187)”。有人遇到过这个问题吗?
  • @John,我解压缩了 opencv jar,但没有找到适用于 windows 的库,仅适用于 Linux 和 MacOS。这可能是它对您不起作用的原因。我对此案没有任何建议:(
  • @luizfzs 谢谢你的帮助。
  • 不幸的是,此 groupId 仅包含 OpenCV 2。如果您需要更新的功能,例如 DNN(深度神经网络),请使用以下版本 (org.openpnp) 和 3.4 版本.2-0
【解决方案3】:

试试这个,看看是否有效:

  • nu.pattern.OpenCV.loadShared();
  • System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);

API 部分的更多信息:https://github.com/patternconsulting/opencv

还有 2.4.9-7 opencv 依赖。

【讨论】:

  • PS loadShared 在 Java 12+ 中不再可用,包括新的 LTS 版本 17。这意味着您必须安装 opencv java 的确切版本(不太可能在 apt 中)并添加到 java.libraries 。小路。我还没有让它工作
【解决方案4】:

目前没有官方方法可以将 OpenCV 的官方 Java 绑定用作 Maven 依赖项(正如 cmets 中已经提到的,Maven 工件已在 #4588 中请求,但仍无人参与)。不过,有 3 种可能的方法可以解决您的问题:

  • java.lang.UnsatisfiedLinkError 被抛出,因为您需要单独安装绑定的二进制文件(即“opencv_java”)。最有可能的是,该非官方工件不包括它们(或与您的系统不兼容的工件)。为了构建绑定:

    1. git clone OpenCV 存储库。
    2. git checkout 预期版本(您似乎使用的是 2.4.9 版本,尽管有更新的版本可用)
    3. 按照说明 here 构建 OpenCV 及其 Java 绑定,从而生成动态链接库(“opencv_java249.dll”、“libopencv_java249.so”或其他内容,具体取决于您的操作系统)。
    4. 将共享库文件复制到您的java.library.path(同样,此变量取决于系统,但可以在运行应用程序时定义)。此时,您应该可以使用该工件了。
  • 另一种方法是使用其他绑定JavaCPP presets for OpenCV 似乎和官方绑定一样好用,而且这些都在 maven 中注册(包括各种平台的二进制文件!) .请记住,API 可能并不完全相同。

  • 这个解决方案听起来可能有点过分,但它在过去对我有效。基本上,您可以避免使用绑定:在 C++ 中实现您的解决方案,然后通过 JNI 将其与 JVM 链接或使其成为一个单独的应用程序,由主应用程序通过系统的其他机制使用(进程生成,I/O 通道,你的名字)。例如,我曾经制作了一个用于特征提取的服务组件,其他程序将通过 ZeroMQ 套接字连接到该组件。

【讨论】:

    【解决方案5】:

    随便用 nu.pattern.OpenCV.loadShared();

    用这个静态 void 方法写一个类

    class Test {
    public static void loadOpenCVNativeLibrary() {
    nu.pattern.OpenCV.loadShared();
    }
    }
    

    然后在你的应用程序类(使用静态主程序)中为 web 应用程序(例如 spring boot)调用它

    static {
    Test.loadOpenCVNativeLibrary();
    }
    ...
    public static void main(String[] args) throws UnknownHostException {
    }
    

    【讨论】:

      【解决方案6】:

      您所需要的一切: 在本地 Maven 存储库中安装 jar:

      mvn install:install-file -Dfile=C:\opencv411\build\java\opencv-411.jar -DgroupId=org -DartifactId=opencv -Dversion=4.1.1 -Dpackaging=jar
      

      在 pom.xml 中创建一个依赖项:

       <dependency> 
       <groupId>org</groupId> 
       <artifactId>opencv</artifactId>
       <version>4.1.1</version>  
      </dependency> 
      

      现在 jar 已打开,我们需要以某种方式添加 OpenCV 库。我通过将 java.library.path 中的 lib 文件夹添加到 maven-surefire 插件来做到这一点:

      <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-surefire-plugin</artifactId>
       <version>2.22.2</version>
       <configuration>
        <argLine>-Djava.library.path=${project.build.outputDirectory}/lib</argLine>
       </configuration>
      </plugin>
      
          public static void main(String[] arges) throws MalformedURLException, 
      IOException, Exception {
          loadLibraries();
      
          // create and print on screen a 3x3 identity matrix
          System.out.println("Create a 3x3 identity matrix...");
          Mat mat = Mat.eye(3, 3, CvType.CV_8UC1);
          System.out.println("mat = " + mat.dump());
      
          // prepare to convert a RGB image in gray scale
          String location = "resources/Poli.jpg";
          System.out.print("Convert the image at " + location + " in gray scale... ");
          // get the jpeg image from the internal resource folder
          Mat image = Imgcodecs.imread(location);
          // convert the image in gray scale
          Imgproc.cvtColor(image, image, Imgproc.COLOR_RGB2GRAY);
          // write the new image on disk
          Imgcodecs.imwrite("resources/Poli-gray.jpg", image);
          System.out.println("Done!");
      
      }
      
          private static void loadLibraries() {
      
          try {
              InputStream in = null;
              File fileOut = null;
              String osName = System.getProperty("os.name");
      //            String opencvpath = System.getProperty("user.dir");
              String opencvpath = "C:\\opencv411\\build\\java\\";
              if (osName.startsWith("Windows")) {
                  int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model"));
                  if (bitness == 32) {
                      opencvpath = opencvpath + "\\x86\\";
                  } else if (bitness == 64) {
                      opencvpath = opencvpath + "\\x64\\";
                  } else {
                      opencvpath = opencvpath + "\\x86\\";
                  }
              } else if (osName.equals("Mac OS X")) {
                  opencvpath = opencvpath + "Your path to .dylib";
              }
              System.out.println(opencvpath);
      //        System.out.println("Core.NATIVE_LIBRARY_NAME = " + Core.NATIVE_LIBRARY_NAME);
              System.out.println("Core.NATIVE_LIBRARY_NAME = " + "opencv_java411.dll");
      //        System.load(opencvpath + Core.NATIVE_LIBRARY_NAME + ".dll");
              System.load(opencvpath + "opencv_java411.dll");
          } catch (Exception e) {
              throw new RuntimeException("Failed to load opencv native library", e);
          }
      }
      

      【讨论】:

        【解决方案7】:

        对于那些想在 MacOs 环境中使用 OpenCV 3.2 的人,您可以使用以下存储库定义:

        <repositories>
           <repository>
              <id>kodfarki</id>
              <url>https://raw.githubusercontent.com/kodfarki/repository/master/</url>
           </repository>
        </repositories>
        

        https://github.com/kodfarki/opencv-example中还有一个示例项目。

        要使用这个示例项目,您仍然需要安装 OpenCV 二进制文件

        brew tap homebrew/science brew install opencv3 --with-java --with-contrib

        【讨论】:

          【解决方案8】:

          对于 Windows,@Sachin Aryal's answer 存在问题。 answer by @Anirban Chakraborty 是一个很好的提示。但是,如this thread 所述,运行时仍然存在问题。

          最后用OpenCV.loadLocally(); 替换OpenCV.loadShared(); 对我有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-04-08
            • 2018-07-05
            • 1970-01-01
            • 1970-01-01
            • 2016-01-02
            • 2013-05-22
            • 2013-11-12
            相关资源
            最近更新 更多