来自Maven的Java OpenCV

dee*_*eem 16 java opencv maven

有没有办法从存储库中获取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>
Run Code Online (Sandbox Code Playgroud)

可悲的是,我得到了错误

Caused by: java.lang.UnsatisfiedLinkError: no opencv_java249 in java.library.path
Run Code Online (Sandbox Code Playgroud)

我正在使用的时候System.loadLibrary(Core.NATIVE_LIBRARY_NAME).我可以添加这个库,使我的项目包含它并"忘记"手动将其添加到类路径吗?

Sac*_*yal 16

这对我有用.

nu.pattern.OpenCV.loadLibrary();
Run Code Online (Sandbox Code Playgroud)

我正在使用以下maven依赖

<dependency>
  <groupId>nu.pattern</groupId>
  <artifactId>opencv</artifactId>
  <version>2.4.9-4</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用.只需用OpenCV.loadLibrary()替换System.loadLibrary(Core.NATIVE_LIBRARY_NAME); (2认同)
  • 我收到此错误“不支持操作系统“WINDOWS”和体系结构“X86_64”。在 nu.pattern.OpenCV.loadLibrary(OpenCV.java:187)”。有人遇到过这个问题吗? (2认同)
  • @John,我解压缩了opencv jar,但没有找到Windows的库,仅找到Linux和MacOS的库。这可能就是为什么它对您不起作用的原因。我对此案没有任何建议:( (2认同)

小智 16

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

<dependency>
    <groupId>org.openpnp</groupId>
    <artifactId>opencv</artifactId>
    <version>3.2.0-0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

并替换以下行:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME)
Run Code Online (Sandbox Code Playgroud)

nu.pattern.OpenCV.loadShared();
Run Code Online (Sandbox Code Playgroud)

这应该也解决了WINDOWS中的问题.快乐的编码.


E_n*_*ate 6

目前还没有正式的方法可以将OpenCV的官方Java绑定用作Maven依赖(正如评论中已经提到的,Maven工件已在#4588中被请求,但仍然无人值守).然而,有三种可能的方法来解决您的问题:

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

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

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


小智 6

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

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

更多信息请参见API部分:https://github.com/patternconsulting/opencv

还有2.4.9-7 opencv依赖.