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);
}
我正在使用 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);
}