2016-01-22 15 views
5

Đây là lần đầu tiên tôi sử dụng thư viện openCV. Tôi muốn sử dụng nó để phát hiện mắt. Tôi đã sử dụng các FdActivity mã có sẵn trong hướng dẫn này:OpenCV cho Android: không tải được lỗi phân loại xếp tầng

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

Các hướng dẫn sử dụng OpenCV 2.4.6, nhưng tôi đã tải về phiên bản 3.1 trong dự án của tôi. Do sự khác biệt phiên bản, tôi đã thay đổi các dòng sử dụng putText, hình chữ nhật và hình tròn được nhập từ imgproc thay vì Core. Đây là tất cả những gì tôi đã thay đổi. Tôi đã thêm haarcascade_lefteye_2splits.xml và lbpcascade_frontalface.xml vào thư mục thô trong thư mục res.

Khi chạy ứng dụng Tôi nhận được lỗi này trong logcat:

failed to load cascade classifier 

nào chỉ được tạo ra từ những dòng nhập nếu mJavaDetector hoặc mJavaDetectorEye trống:

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

        } 

Tôi đoán đường dẫn đến "haarcascade_eye_right.xml" không chính xác hoặc tệp xml không tồn tại, đây có phải là nguyên nhân gây ra lỗi không?

Nếu có, làm cách nào để có tệp xml và tôi sẽ lưu trữ chính xác ở đâu? Nếu không, điều gì gây ra vấn đề?

Lưu ý: Tôi sử dụng Android Studio.

Tôi đánh giá cao bất kỳ sự trợ giúp nào về vấn đề này, tôi đã thử một lúc, nhưng tôi không thể giải quyết được.

Trả lời

14

Tôi hiểu rồi. Mặc dù tôi không có ý tưởng về WHY. ...

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

...

nó làm việc cho tôi.

+0

vâng đó chắc chắn là một lỗi, chỉ định một đường dẫn đã được gọi là tải(). cảm ơn vì đã tiết kiệm thời gian cho tôi! –

+0

omg, tôi không thể cảm ơn đủ @ william Liu ... chi tiêu giờ và giờ về điều này, so với các ví dụ trong github và tất cả, và cuối cùng là một lỗi opencv của nó .... thankyou william. :-) – Santosh

+0

ngu ngốc opencv ... – user25

Các vấn đề liên quan