【问题标题】:Using JavaCV with Kotlin在 Kotlin 中使用 JavaCV
【发布时间】:2019-06-27 22:56:13
【问题描述】:

我目前正在尝试在 Kotlin 中使用 JavaCV 启动一个项目。我使用 IntelliJ Idea 作为我的 IDE。我正在使用 JavaCV 1.3.2 和 OpenCV 3.20。 这是我对 OpenCV 的模块依赖项的设置:

对于 JavaCV:

我在依赖项中的 javacv 之前有 opencv。 为了测试 OpenCV 是否存在且有效,我编写了以下代码进行测试。由于我可以 loadLibrary 并且版本号显示正确,我可以假设 OpenCV 确实在工作。

import org.opencv.core.Core
import org.opencv.core.Mat
import org.opencv.core.CvType
import org.opencv.core.Scalar
import org.bytedeco.javacv.OpenCVFrameGrabber

fun main(args : Array<String>) {
    println("Test Built Successfully")
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME)
    println("Running OpenCV Version ${Core.VERSION}")
    val grabber = OpenCVFrameGrabber(1)
}

我们初始化抓取器的那一行出现以下异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jniopencv_core in java.library.path
Caused by: java.lang.UnsatisfiedLinkError: no opencv_imgproc320 in java.library.path

也许我在这里遗漏了一些东西,但我已按照 JavaCV 的 Git 存储库中的 README.md 提供的说明进行操作。我还没有看到其他人尝试在 StackOverflow 上将此库与 Kotlin 一起使用,但我查看了一些关于使用 java 引发相同异常的帖子。

【问题讨论】:

    标签: opencv intellij-idea kotlin


    【解决方案1】:

    在 Kotlin 和 Java 中处理这个错误没有什么不同;您需要为 opencv 指定本机库的路径。默认情况下,在 Windows 上,它将在 PATH 环境变量中设置的任何内容中查找本机库。

    您还可以通过指定系统属性java.library.path(如错误消息所示)来明确指定要查找本机库的目录。

    例如,您可以像这样添加运行配置:

    ${PATH_TO_DYNAMIC_LIB} 将是本机库 opencv_imgproc320.dll 所在的位置 - 我认为在您的情况下它将是 C:/Users/ms/IdeaProjects/CVTest/opencv/build/java/x64

    【讨论】:

    • 在 VM 选项中更改库路径破坏了在 intellij 中配置的其他库,因为它们没有相同的库路径,如果指定,则使用此路径代替您为库指定的路径配置。
    【解决方案2】:

    我可以通过将我的 VM 选项留空并在我的 JavaCV 库配置中添加所有必要的 OpenCV 库作为本机库路径来解决此问题。

    【讨论】:

      【解决方案3】:

      在 MacOS 上,您不需要安装本机库。在 OpenCV3.41 上,从

      获取
      <!-- https://mvnrepository.com/artifact/org.openpnp/opencv -->
          <dependency>
            <groupId>org.openpnp</groupId>
            <artifactId>opencv</artifactId>
            <version>3.4.2-1</version>
          </dependency>
      

      我查看了库 (jar tf ~/.m2/repository/org/openpnp/opencv/3.4.2-1/opencv-3.4.2.-1.jar) 并在其中找到了 dll 和其他东西:

      jar tf *1.jar | grep nu
      ...
      nu/pattern/opencv/osx/
      nu/pattern/opencv/osx/x86_64/
      nu/pattern/opencv/osx/x86_64/README.md
      nu/pattern/opencv/osx/x86_64/cmake.log
      nu/pattern/opencv/osx/x86_64/libopencv_java342.dylib
      ...
      

      这让我找到了this StackOverflow question on nu.pattern,它展示了如何在代码中使用 nu.pattern。

      static {
          nu.pattern.OpenCV.loadShared();
          System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);
      }
      

      此序言代码启用了以前失败的示例应用程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        相关资源
        最近更新 更多