所以我想玩一点OpenCV。我的测试项目是使用Java(操作系统是Debian Linux 8.4),并且已经按照本教程构建OpenCV:https://opencv-java-tutorials.readthedocs.io/en/latest/01-installing-opencv-for-java.html
修复了几个问题后,我能够成功构建OpenCV jar和so文件。在构建过程中没有错误或警告。我已经将 opencv-400.jar 和 libopencv_java400.so 放入了项目的 lib 子文件夹中。添加了jar文件以在Eclipse中构建路径,并在Eclipse的Build Configurations中将正确的路径放置到该文件中。
我的项目只有一个Main类,这是我在OpenCV的源代码中找到的示例,所以没有什么复杂的事情:
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.out.println("Welcome to OpenCV " + Core.VERSION);
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat m = Mat.eye(3, 3, CvType.CV_8UC1);
System.out.println("m = " + m.dump());
}
}
看起来一切正常,但是当我运行项目时,我看到了这个异常:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/firzen/ownCloud/develop/java/workspace/CVExperiments/lib/libopencv_java400.so: /home/firzen/ownCloud/develop/java/workspace/CVExperiments/lib/libopencv_java400.so: undefined symbol: _ZNK6google8protobuf8internal12MapFieldBase28SpaceUsedExcludingSelfNoLockEv
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1938)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at Main.main(Main.java:9)
这部分例外确实让我担心:
/home/firzen/ownCloud/develop/java/workspace/CVExperiments/lib/libopencv_java400.so: undefined symbol: _ZNK6google8protobuf8internal12MapFieldBase28SpaceUsedExcludingSelfNoLockEv
在我看来,该 libopencv_java400.so 文件有问题。我对吗?还是我需要其他文件才能使其正常工作?我已经将OpenCV构建为Debug,因此该文件具有135 MiB,但是我认为这应该不是问题。
我将感谢您的任何想法!
答案 0 :(得分:1)
该错误表示您的系统没有安装合适的protobuf库。您可以尝试sudo apt install libprotobuf10
,尽管我不能保证会有所帮助。
或者,您也可以运行ldd /home/firzen/ownCloud/develop/java/workspace/CVExperiments/lib/libopencv_java400.so
,这将向您显示OpenCV尝试导入的所有库-也许Protobuf实际上是与OpenCV一起构建的,但尚未安装。