我有以下的依赖关系 org.bytedeco:opencv:4.1.2-1.5.2
的项目,再由
<groupId>org.datavec</groupId>
<artifactId>datavec-data-image</artifactId>
<version>${datavec.version}</version>
而为了需要 datavec-data-image
open-cv加载良好,所有内部的open-cv动作都被执行。
然后,我想显式地执行一些open cv的动作。我使用了一个来自 https:/github.comrostrovskypdf-table。 做这个东西。
public class PdfTableReader {
private TableExtractor extractor;
private PdfTableSettings settings;
static {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
而且它失败了
Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java412 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at pdftable.PdfTableReader.<clinit>(PdfTableReader.java:32)
at pdftable.ExtractSyzlekFromPdf.main(ExtractSyzlekFromPdf.java:12)
我应该怎么做才能明确这一点 javacv
部分工作 datavec
图像代码,而不做双显式 open-cv
安装到我的电脑上的某个位置,并设置了 java.library.path
明确提出? 至少是 datavec
图像代码在没有这个明确设置的情况下,以某种方式获取它。
我也试着跟进这个答案。https:/stackoverflow.coma575151321759063。 但是没有成功(如果我理解正确的话,他们使用的依赖关系是以跨平台的方式提供原生库,即提供所有平台的二进制文件,并且在正确的平台上使用所需的那个)。我想应该有一种方法可以让 java.library.path
的情况下动态更新。open-cv
原生的二进制文件打包到maven的依赖关系中,并附加到项目中。但是怎么做呢?
如果DL4J的人能够解释如何正确使用那里的javacv部分,那将是完美的。
OpenCV的Java API在 org.opencv
包中没有加载器,所以这些库需要通过外部的其他东西来加载。在JavaCPP Presets for OpenCV的情况下,这些库和封装器都被捆绑在JAR文件中,我们可以调用 Loader.load(opencv_java.class)
来加载这里的所有内容。https:/github.combytedecojavacpp-presetstreemasteropencv#documentation。
JavaCV、Deeplearning4j和DataVec没有使用OpenCV的那个Java API,它们使用的是在 org.bytedeco.opencv
包,自动加载一切,所以他们不需要调用任何东西。