java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J

java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J

我正在使用 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; OpenCV 的库未由您的 Java VM 加载,因此无法进行相关的本机调用。

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

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

static {

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

    System.load(libraryPath);

}