6

我正在尝试将 OpenCV 与 Hadoop 一起使用。下面是我的代码。我只是在测试 OpenCV 库是否适用于 Hadoop,即当我在 public int run(String[] args)Hadoop 功能中运行 OpenCV 代码时。

我在网上搜索,发现了一些如何libopencv_java310.so在 Hadoop 中添加 OpenCV 原生库()的方法。我尝试了一些方法,但没有奏效。例如本教程

它说添加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;
}
4

1 回答 1

1

我面临着同样的问题。我使用了以下解决方法。

您可以从使用 JavaCV 工具开始,因为它与 hadoop 完美配合。然后使用 OpenCv,通过将所有 opencv 库和 jar 包装在可执行 jar 中来制作可执行 jar。现在本机库由操作系统加载。所以在可执行的jar文件中,编写提取OpenCv原生库的代码来回火pry文件,然后加载库,最后删除临时文件。

于 2016-04-11T22:49:33.907 回答