2016-01-22 30 views
5

這是我第一次用OpenCV庫。我想用它來檢測眼睛。我已經使用的可用FdActivity代碼在本教程:OpenCV進行Android的:加載失敗級聯分類錯誤

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

本教程使用了OpenCV 2.4.6,但我已經在我的項目下載3.1版本。由於版本差異,我更改了使用putText,矩形和圓圈從imgproc而不是Core導入的行。這就是我所改變的。我已將haarcascade_lefteye_2splits.xml和lbpcascade_frontalface.xml添加到res文件夾下的原始文件夾中。

當運行應用程序,我在logcat中得到這個錯誤:

failed to load cascade classifier 

僅根據這些線路產生的,如果mJavaDetector或mJavaDetectorEye是空的:

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(); 

        } 

我猜的路徑「haarcascade_eye_right.xml」不正確,或者xml文件不存在,這是什麼導致錯誤?

如果是的話,我怎麼能在XML文件,而我正是應存儲呢?如果不是,是什麼導致了這個問題?

注:我使用Android工作室。

我很感激在這方面的任何幫助,我一直在嘗試了一段時間,但我沒能解決它。

回答

14

我明白了。雖然我不知道爲什麼。 ...

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

...

它爲我工作。

+0

是啊,這絕對是一個錯誤,指定路徑應該已經調用加載()。謝謝你節省我的時間! –

+0

03,我不知道怎麼感謝你纔好@william劉...花費幾個小時在此,在github上和所有的例子相比,最後它的一個OpenCV的錯誤....三江源威廉。 :-) – Santosh

+0

愚蠢的opencv ... – user25