opencv库在hadoop中加载但不起作用

yquaqz18  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(338)

我正在尝试将opencv与hadoop结合使用。下面是我的代码。我只是在测试opencv库在hadoop中是否正常工作,即在函数中运行opencv代码时 public int run(String[] args) hadoop的一部分。
我在网上搜索了一下,找到了一些如何添加opencv本机库的方法( libopencv_java310.so )在hadoop中。我试过一些方法,但没有成功。例如本教程。
上面写着加 JAVA.LIBRARY.PATHhadoop-config.sh 文件。但没用。我犯了这个错误

Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java310 in java.library.path
at line
System.loadLibrary(Core.NATIVE.LIBRARY.NAME);

最后,我添加了opencv本机库( libopencv_java310.so )到此路径(从internet获得解决方案)

$HADOOP_HOME/lib/native

它似乎起了作用。我没有得到上面的错误。但我在下一行有个错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.opencv.objdetect.CascadeClassifier.CascadeClassifier_1(Ljava/lang/String;)

此错误位于第行:

CascadeClassifier cad = new CascadeClassifier();

据我所知,如果没有加载opencv本机库,就会出现这个错误。但是现在库被加载了,我不知道这个错误的原因是什么。

public int run(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf);
    job.setJarByClass(readVideoFile.class);
    job.setJobName("smallfilestoseqfile");
    job.setInputFormatClass(readVideoInputFormat.class);
    job.setNumReduceTasks(1);
    FileInputFormat.setInputPaths(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    job.setMapperClass(readVideoMapper.class);

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    CascadeClassifier cad = new CascadeClassifier();

    return job.waitForCompletion(true) ? 0 : 1;
}
raogr8fs

raogr8fs1#

我也面临同样的问题。我使用了以下解决方法。
您可以从使用javacv工具开始,因为它与hadoop完美结合。然后使用opencv,通过将所有opencv库和jar Package 到可执行jar中来创建一个可执行jar。现在本地库由操作系统加载。因此,在可执行jar文件中,编写提取opencv本机库的代码对pry文件进行回火,然后加载库,最后删除temp文件。

相关问题