2016-01-22 13 views
5

Questa è la prima volta che utilizzo la libreria openCV. Voglio usarlo per rilevare gli occhi. Ho usato il codice FdActivity disponibile in questo tutorial:OpenCV per Android: impossibile caricare l'errore di classificazione cascade

http://romanhosek.cz/android-eye-detection-updated-for-opencv-2-4-6/

Il tutorial utilizza OpenCV 2.4.6, ma ho scaricato la versione 3.1 nel mio progetto. A causa delle differenze di versione, ho modificato le linee che usano putText, rectangle e circle per essere importate da imgproc invece che da Core. Questo è tutto ciò che ho cambiato. Ho aggiunto haarcascade_lefteye_2splits.xml e lbpcascade_frontalface.xml nella cartella raw nella cartella res.

Quando si esegue l'applicazione ottengo questo errore nel logcat:

failed to load cascade classifier 

che viene generato solo da queste linee se mJavaDetector o mJavaDetectorEye è vuoto:

try { 
         // load cascade file from application resources 
         InputStream is = getResources().openRawResource(
           R.raw.lbpcascade_frontalface); 
         File cascadeDir = getDir("cascade", Context.MODE_PRIVATE); 
         mCascadeFile = new File(cascadeDir, 
           "lbpcascade_frontalface.xml"); 
         FileOutputStream os = new FileOutputStream(mCascadeFile); 

         byte[] buffer = new byte[4096]; 
         int bytesRead; 
         while ((bytesRead = is.read(buffer)) != -1) { 
          os.write(buffer, 0, bytesRead); 
         } 
         is.close(); 
         os.close(); 

         // --------------------------------- load left eye 
         // classificator ----------------------------------- 
         InputStream iser = getResources().openRawResource(
           R.raw.haarcascade_lefteye_2splits); 
         File cascadeDirER = getDir("cascadeER", 
           Context.MODE_PRIVATE); 
         File cascadeFileER = new File(cascadeDirER, 
           "haarcascade_eye_right.xml"); 
         FileOutputStream oser = new FileOutputStream(cascadeFileER); 

         byte[] bufferER = new byte[4096]; 
         int bytesReadER; 
         while ((bytesReadER = iser.read(bufferER)) != -1) { 
          oser.write(bufferER, 0, bytesReadER); 
         } 
         iser.close(); 
         oser.close(); 

         mJavaDetector = new CascadeClassifier(
           mCascadeFile.getAbsolutePath()); 
         if (mJavaDetector.empty()) { 
          Log.e(TAG, "Failed to load cascade classifier"); 
          mJavaDetector = null; 
         } else 
          Log.i(TAG, "Loaded cascade classifier from " 
            + mCascadeFile.getAbsolutePath()); 

         mJavaDetectorEye = new CascadeClassifier(
           cascadeFileER.getAbsolutePath()); 
         if (mJavaDetectorEye.empty()) { 
          Log.e(TAG, "Failed to load cascade classifier"); 
          mJavaDetectorEye = null; 
         } else 
          Log.i(TAG, "Loaded cascade classifier from " 
            + mCascadeFile.getAbsolutePath()); 



         cascadeDir.delete(); 

        } 

Credo che il percorso "haarcascade_eye_right.xml" non è corretto, oppure il file xml non esiste, è questo che sta causando l'errore?

Se sì, come posso avere il file xml e dove esattamente lo memorizzerò? Se no, qual è la causa del problema?

Nota: utilizzo Android Studio.

Apprezzerei qualsiasi aiuto in questo senso, ci ho provato per un po ', ma non ho potuto risolverlo.

risposta

14

Ho capito. Anche se non ho idea di PERCHÉ. ...

mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath()); 
//must add this line 
mJavaDetector.load(mCascadeFile.getAbsolutePath()); 

...

funziona per me.

+0

sì, questo è sicuramente un bug, specificare un percorso dovrebbe già chiamare load(). grazie per avermi salvato ore! –

+0

omg, non posso ringraziarti abbastanza @william Liu ... trascorrendo ore e ore su questo, rispetto agli esempi in github e tutto, e infine è un bug di tipo opencv .... grazie William. :-) – Santosh

+0

stupido opencv ... – user25

Problemi correlati