【发布时间】: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