2016-03-28 23 views
5

Sto cercando di utilizzare OpenCV con Hadoop. Di seguito è il mio codice. Sto solo testando se le librerie OpenCV funzionano bene con Hadoop, cioè quando eseguo codice OpenCV nella funzione public int run(String[] args) di Hadoop.La libreria OpenCV è caricata in hadoop ma non funziona

Ho cercato su Internet e ho trovato alcuni modi per aggiungere la libreria nativa OpenCV (libopencv_java310.so) in Hadoop. Ho provato alcuni modi, ma non ha funzionato. Ad esempio this tutorial.

Si dice aggiungi JAVA.LIBRARY.PATH a hadoop-config.sh file. Ma non ha funzionato. Ho ottenuto questo errore

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

Infine, ho aggiunto la libreria nativa OpenCV (libopencv_java310.so) a questo percorso (ottenuto soluzione da internet)

$HADOOP_HOME/lib/native 

E sembra aver funzionato. Non ho ricevuto l'errore sopra riportato. Ma ho ottenuto questo errore alla riga successiva:

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

Questo errore è alla riga:

CascadeClassifier cad = new CascadeClassifier(); 

Per quanto ne so, si ottiene questo errore se OpenCV libreria nativa non è stato caricato. Ma ora la libreria è caricata, non so qual è la ragione di questo errore.

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

Non caricare le librerie in un metodo, ma in un inizializzatore statico. 'UnsatisfiedLinkErrors' vengono lanciati anche se si tenta di caricare una libreria più di una volta. – user4759923

+0

Perché non utilizzare [HIPI] (http://hipi.cs.virginia.edu/gettingstarted.html)? – vzamanillo

+0

Ci sono alcuni metodi specifici, che ci sono solo in OpenCv. Usare HIPI è una cosa diversa. Grazie per la tua risposta.. –

risposta

1

Mi trovavo di fronte allo stesso problema. Ho usato la seguente soluzione alternativa.

È possibile iniziare utilizzando lo strumento JavaCV poiché funziona perfettamente con hadoop. Quindi con OpenCv, crea un jar eseguibile avvolgendo tutte le librerie e i vasi opencv all'interno del jar eseguibile. Ora la libreria nativa viene caricata dal sistema operativo. Quindi, all'interno del file jar eseguibile, scrivi il codice che estrae la libreria nativa di OpenCv per moderare il file di pry, quindi carica la libreria e infine elimina il file temporaneo.

Problemi correlati