Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.unsatifiedlinkerror:org.opencv.core.Mat.n_Mat(iiljava/nio/ByteBuffer;)J_Java_Opencv_Kotlin_Gradle_Javacv - Fatal编程技术网

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

java.lang.unsatifiedlinkerror:org.opencv.core.Mat.n_Mat(iiljava/nio/ByteBuffer;)J,java,opencv,kotlin,gradle,javacv,Java,Opencv,Kotlin,Gradle,Javacv,我正在使用JavaFX和JavaCV进行项目。我在应用程序中的主要功能是基于网络摄像头捕获。我正在寻找一种将OpenCVFrameGrabber中的帧显示到JavaFX组件中的方法 我找到了这样做的方法,但出现以下错误: Exception in thread "main" java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J at org.opencv

我正在使用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)
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()))
        }
    }
}
导入javafx.scene.image.image
导入org.bytedeco.javacv.Frame
导入org.bytedeco.javacv.OpenCVFrameConverter
导入org.bytedeco.javacv.OpenCVFrameGrabber
导入org.opencv.core.Mat
导入org.opencv.core.MatOfByte
导入org.opencv.imgcodecs.imgcodecs
导入java.io.ByteArrayInputStream
类TestJavaCV{
伴星{
private val toOrgOpenCvCoreMat=OpenCVFrameConverter.toOrgOpenCvCoreMat()
@JvmStatic
趣味主线(args:Array){
val抓取器:OpenCVFrameGrabber=OpenCVFrameGrabber(0);
grabber.start()
val frame:frame=grabber.grabFrame()
val mat:mat=toOrgOpenCvCoreMat.convert(帧)
val matOfByte:matOfByte=matOfByte()
Imgcodecs.imencode(“.png”、mat、matOfByte)
val image=image(ByteArrayInputStream(matOfByte.toArray()))
}
}
}
这个问题回答了为什么会出现
不满意的链接错误
;Java VM没有加载OpenCV库,因此无法进行相关的本机调用

这个问题应该可以帮助您使用Gradle配置OpenCV

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

static {

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

    System.load(libraryPath);

}

UnsatisfiedLinkError通常意味着缺少驱动程序,而不是类。对Mat.n_Mat()的调用可能是对不可用的本机驱动程序的调用。这可能不是JAR,但更可能是缺少DLL。请检查-这是一个非常类似的问题,并显示如何加载驱动程序。我阅读了您的参考资料。在项目中,我要求应用程序在Windows10、Linux和MacOS上运行。我想知道是否可以使用gradle而不是提供lib的路径。另一个问题:如果我使用gradle,openCV在哪里可以使用Load by path<代码>System.load(“my/full/path/native.dll”)如果系统上安装了openCV,则应该有一个可引用的DLL。您需要检查openCV文档。从参考问题中,他们建议使用
System.load(“fullPathTo/opencv.dll”)-您需要找出opencv.dll在系统上的安装位置。“fullPathTo”只是实际路径的占位符。对于JavaCV,只需调用
Loader.load(opencv\u java.class)
就更容易了,如下所述:
static {

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

    System.load(libraryPath);

}