这个问题在这里已经有了答案:
java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(III)J?
(3 个回答)
1年前关闭。
我正在使用 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()))
}
}
}
最佳答案
这个问题java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(III)J?回答为什么你会得到 UnsatisfiedLinkError
;您的 Java VM 未加载 OpenCV 的库,因此无法进行相关的 native 调用。
这个问题How to use opencv in using Gradle?应该可以帮助您使用 Gradle 配置 OpenCV。
根据您的评论问题“我要求该应用程序在 Windows 10、Linux 和 MacOS 上运行。”我不知道如何使用 gradle 来解决这个问题,但是在 Java 中,我会为每个操作系统注入(inject)一个不同的系统属性,并在你的类的静态 block 中使用它来加载你的库:
static {
String libraryPath = System.getProperty("opencv.path");
System.load(libraryPath);
}
关于java.lang.UnsatisfiedLinkError : org. opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63056169/