2016-03-28 26 views
5

OpenCVをHadoopで使用しようとしています。以下は私のコードです。私は、OpenCVライブラリがHadoopで正常に動作するかどうか、つまりOpenCVコードをHadoopの関数 public int run(String[] args)で実行しているかどうかをテストしています。OpenCVライブラリがhadoopにロードされていても動作していません

私はインターネットで検索し、OpenCVネイティブライブラリ(libopencv_java310.so)をHadoopに追加する方法をいくつか見つけました。私はいくつかの方法を試みたが、うまくいかなかった。たとえば、this tutorialです。

JAVA.LIBRARY.PATHhadoop-config.shというファイルが追加されています。 しかし、うまくいかなかった。私は私がこのパスにOpenCVのネイティブライブラリ(libopencv_java310.so)を加え、最後にこのエラー

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

を得た

$HADOOP_HOME/lib/native 

(インターネットから解決策を得た)そして、働いているようです。上記のエラーは発生しませんでした。 しかし、私は次の行では、このエラーを得た:

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

このエラーはラインである:OpenCVのネイティブライブラリがロードされていない場合

CascadeClassifier cad = new CascadeClassifier(); 

は、私の知る限りでは、我々はこのエラーを取得します。しかし今、ライブラリがロードされて、私はこのエラーの理由がわからない。

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; 
} 
+0

メソッドではなく静的初期化子でライブラリをロードします。 'UnsatisfiedLinkErrors'は、ライブラリが複数回読み込まれる場合にもスローされます。 – user4759923

+0

なぜ[HIPI](http://hipi.cs.virginia.edu/gettingstarted.html)を使用しないのですか? – vzamanillo

+0

いくつかの具体的な方法がありますが、OpenCvにしかありません。 HIPIを使うことは別のことです。お返事をありがとうございます.. –

答えて

1

私は同じ問題に直面していました。私は次の回避策を使用しました。

JavaCVツールを使用すると、hadoopで完全に動作するようになります。 OpenCvで、すべてのopencvライブラリとjarを実行可能なjarファイルにラップして、実行可能なjarファイルを作成します。現在、ネイティブライブラリはオペレーティングシステムによってロードされています。したがって、実行可能なjarファイル内で、OpenCvネイティブライブラリを抽出してテンポラリファイルにするコードを書いてから、ライブラリをロードし、最後に一時ファイルを削除します。

関連する問題