OpenCV + Java = UnsatisfiedLinkError
Posted
技术标签:
【中文标题】OpenCV + Java = UnsatisfiedLinkError【英文标题】: 【发布时间】:2013-09-08 16:12:23 【问题描述】:我需要从我的 USB 网络摄像头捕获视频流,为此我使用 Opencv 2.4.6 进行 Java 开发。我按照here中列出的步骤进行操作
我将“C:\opencv\build\java\x64”目录添加到我的系统路径中,并将“opencv-246.jar”文件包含到我在 ECLIPSE 上的库中。当你运行 explame
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
public class Main
public static void main(String[] args)
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat m = Mat.eye(3, 3, CvType.CV_8UC1);
System.out.println("m = " + m.dump());
我明白了
m = [1, 0, 0;
0, 1, 0;
0, 0, 1]
好的 =)
但是当我运行时
import org.opencv.highgui.VideoCapture;
public class Main
public static void main(String[] args)
VideoCapture vc = new VideoCapture(0);
if(vc.isOpened())
System.out.println("Works!");
我明白了
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.opencv.highgui.VideoCapture.n_VideoCapture(I)J
at org.opencv.highgui.VideoCapture.n_VideoCapture(Native Method)
at org.opencv.highgui.VideoCapture.<init>(VideoCapture.java:113)
at Main.main(Main.java:5)
我将所有路由添加到:
C:\opencv\build\x64\vc10
一个一个,但不起作用。
最后我使用 C:\opencv\build\x64\vc10 创建了一个名为 OPENCV_DIR 的变量,但仍然出现 UnsatisfiedLinkError。
请帮助我!
【问题讨论】:
【参考方案1】:在你的第二个例子中,你跳过了这一行
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
所以 opencv 库没有加载,UnsatisfiedLinkError 等...
[编辑]:
感谢@Jishnu Prathap 强调了 java.library 路径问题,如果您在设置时遇到问题,您仍然可以尝试使用 java 包装器 so/dll/dylib 的绝对路径,例如:
System.load("/path to/our/java_wrapper");
【讨论】:
静态 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 以确保它被加载一次..【参考方案2】:我在将 OpenCV 与 java 结合使用时遇到了类似的错误。我做了两件事来解决它。
static System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
我将 OpenCV dll 或 .so 的路径添加到 javalibpath 或路径。这实际上由于某种原因不起作用,我最终将 OpenCV dll 放入 system32 文件夹。
【讨论】:
【参考方案3】:试试下面的代码
导入 org.opencv.core.CvType; 导入 org.opencv.core.Mat;
导入 nu.pattern.OpenCV;
公共类 OpencvMain
public static void main( String[] args )
OpenCV.loadLocally();
Mat mat = Mat.eye( 3, 3, CvType.CV_8UC1 );
System.out.println( "mat = " + mat.dump() );
【讨论】:
【参考方案4】:对于使用 opencv3.x 的普通用户:
Java 中不再存在用于 opencv 3.0 及更高版本的 HighGUI 模块。
import org.opencv.videoio.VideoCapture;
而不是
import org.opencv.highgui.VideoCapture;
videoio 包括 VideoCapture、VideoWriter。
同样:
imgcodecs 包括 imread/imwrite 和好友
示例:
Highgui.imread(fileName)
-->
Imgcodecs.imread(fileName)
【讨论】:
【参考方案5】:所以,我也遇到了这个问题,我按照大家的建议做了,它在我的 x64 窗口中运行良好,但在 x86 中无法正常运行。
最后我通过更改找到了解决方案:
VideoCapture capture = new VideoCapture(0);
为
VideoCapture capture = new VideoCapture();
capture.open("resources/vid.MP4");
我不知道为什么会这样,但我希望它可以帮助解决我同样问题的人。
【讨论】:
【参考方案6】:我在网上尝试了很多教程来解决这个问题,但只有一个对我有帮助。 这个方法有两个不同的步骤,
首先,在将 Java 项目从 Opencv SDK 导入 android 工作室时,请确保取消选中导入对话框中显示的所有复选框。
其次,确保导入 SDK 的 native/jdk 中的 OpenCV.mk 文件..
System.loadLibrary() 似乎在这之后返回 true,这对我来说是一个巨大的解脱,因为我花了几个小时才弄清楚这一点
这是帮助我的教程的链接 https://medium.com/@rdeep/android-opencv-integration-without-opencv-manager-c259ef14e73b
【讨论】:
以上是关于OpenCV + Java = UnsatisfiedLinkError的主要内容,如果未能解决你的问题,请参考以下文章