将JavaCV与Kotlin一起使用

时间:2017-06-29 09:50:25

标签: opencv intellij-idea kotlin

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

OpenCV Project Library Configuration

和JavaCV:

JavaCV Project Library Configuration

我在依赖项中的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引发的同一异常的帖子。

3 个答案:

答案 0 :(得分:0)

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

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

例如,您可以添加如下运行配置: run config

${PATH_TO_DYNAMIC_LIB}哪里是本地lib opencv_imgproc320.dll的位置 - 我认为在你的情况下它将是C:/Users/ms/IdeaProjects/CVTest/opencv/build/java/x64

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在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);
}

此序言代码启用了以前无法运行的示例应用程序。