【问题标题】:java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J [duplicate]java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J [重复]
【发布时间】:2020-07-23 14:04:30
【问题描述】:

我正在使用 JavaFX 和 JavaCV 进行项目。我在应用程序中的主要功能是基于网络摄像头捕获。我正在寻找一种将框架从 OpenCVFrameGrabber 显示到 JavaFX 组件中的方法。

我找到了一种方法,但我收到以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J
    at org.opencv.core.Mat.n_Mat(Native Method)
    at org.opencv.core.Mat.<init>(Mat.java:52)
    at org.bytedeco.javacv.OpenCVFrameConverter.convertToOrgOpenCvCoreMat(OpenCVFrameConverter.java:187)
    at org.bytedeco.javacv.OpenCVFrameConverter$ToOrgOpenCvCoreMat.convert(OpenCVFrameConverter.java:61)
    at TestJavaCV$Companion.main(TestJavaCV.kt:20)
    at TestJavaCV.main(TestJavaCV.kt)

我怀疑应用程序由于非依赖失败而无法运行。可能我应该为 org.opencv.core 提供额外的库,但我不知道如何在 gradle 中实现这一点。

最小的、可重现的例子:

build.gradle

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile group: 'org.bytedeco', name: 'javacv-platform', version: '1.5.3'
}

TestJavaCV.kt

import javafx.scene.image.Image
import org.bytedeco.javacv.Frame
import org.bytedeco.javacv.OpenCVFrameConverter
import org.bytedeco.javacv.OpenCVFrameGrabber
import org.opencv.core.Mat
import org.opencv.core.MatOfByte
import org.opencv.imgcodecs.Imgcodecs
import java.io.ByteArrayInputStream

class TestJavaCV {
    companion object {
        private val toOrgOpenCvCoreMat = OpenCVFrameConverter.ToOrgOpenCvCoreMat()

        @JvmStatic
        fun main(args: Array<String>) {
            val grabber: OpenCVFrameGrabber = OpenCVFrameGrabber(0);
            grabber.start()

            val frame: Frame = grabber.grabFrame()
            val mat: Mat = toOrgOpenCvCoreMat.convert(frame)
            val matOfByte: MatOfByte = MatOfByte()

            Imgcodecs.imencode(".png", mat, matOfByte)
            val image = Image(ByteArrayInputStream(matOfByte.toArray()))
        }
    }
}

【问题讨论】:

  • UnsatisfiedLinkError 通常意味着您缺少一个驱动程序,而不是一个类。对 Mat.n_Mat() 的调用很可能是对不可用的本机驱动程序的调用。这可能不是 JAR,但更可能是缺少 DLL 或 SO。
  • 请检查stackoverflow.com/questions/42569126/… - 这是一个非常相似的问题,显示驱动程序是如何加载的。
  • 我阅读了您的参考资料。在项目中,我要求应用程序在 Windows 10、Linux 和 MacOS 上运行。我想知道是否可以使用 gradle 而不是提供 lib 的路径。
  • 另一个问题:如果我使用 gradle,openCV 位于何处以使用路径加载。 System.load("my/full/path/native.dll");
  • 如果你的系统上安装了openCV,你应该有一个DLL来引用。您需要查看 openCV 文档。从引用的问题中,他们建议System.load("fullPathTo/opencv.dll"); - 您需要找出 opencv.dll 在您的系统上安装的位置。 "fullPathTo" 只是实际路径的占位符。

标签: java opencv kotlin gradle javacv


【解决方案1】:

这个问题java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(III)J? 回答了你为什么得到UnsatisfiedLinkError;您的 Java VM 未加载 OpenCV 的库,因此无法进行相关的本地调用。

这个问题How to use opencv in using Gradle? 应该可以帮助您使用 Gradle 配置 OpenCV。

根据您的评论问题“我要求该应用程序在 Windows 10、Linux 和 MacOS 上运行。”我不知道如何使用 gradle 来解决这个问题,但是在 Java 中,我会为每个操作系统注入一个不同的系统属性,并在你的类的静态块中使用它来加载你的库:

static {

    String libraryPath = System.getProperty("opencv.path");

    System.load(libraryPath);

}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
相关资源
最近更新 更多