Gur*_*ngh 6 java opencv hadoop java.library.path hadoop-native-library
我正在尝试将OpenCV与Hadoop一起使用.以下是我的代码.我只是测试OpenCV库是否与Hadoop一起工作,即当我在public int run(String[] args)Hadoop 函数中运行OpenCV代码时
.
我在互联网上搜索,并找到了一些如何libopencv_java310.so在Hadoop中添加OpenCV本机库()的方法.我尝试了一些方法,但它没有用.例如本教程.
它说添加JAVA.LIBRARY.PATH到hadoop-config.sh文件.但它没有用.我收到了这个错误
Exception in thread "main" java.lang.UnsatisfiedLinkError: no opencv_java310 in java.library.path
at line
System.loadLibrary(Core.NATIVE.LIBRARY.NAME);
Run Code Online (Sandbox Code Playgroud)
最后,我将OpenCV本机库(libopencv_java310.so)添加到此路径(从Internet获得解决方案)
$HADOOP_HOME/lib/native
Run Code Online (Sandbox Code Playgroud)
它似乎有效.我没有得到上述错误.但是我在下一行得到了这个错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.opencv.objdetect.CascadeClassifier.CascadeClassifier_1(Ljava/lang/String;)
Run Code Online (Sandbox Code Playgroud)
此错误符合以下条件:
CascadeClassifier cad = new CascadeClassifier();
Run Code Online (Sandbox Code Playgroud)
据我所知,如果未加载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;
}
Run Code Online (Sandbox Code Playgroud)
我面临着同样的问题。我使用了以下解决方法。
您可以从使用 JavaCV 工具开始,因为它与 hadoop 完美配合。然后使用 OpenCv,通过将所有 opencv 库和 jar 包装在可执行 jar 中来制作可执行 jar。现在本机库由操作系统加载。因此,在可执行 jar 文件中,编写提取 OpenCv 本机库以临时 pry 文件的代码,然后加载该库,最后删除临时文件。