OpenCV для Android: не удалось загрузить ошибку каскадного классификатора

Это первый раз, когда я использую библиотеку openCV. Я хочу использовать это, чтобы обнаружить глаза. Я использовал FdActivity код, доступный в этом уроке:

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

В учебнике используется OpenCV 2.4.6, но я скачал версию 3.1 в своем проекте. Из-за различий версий я изменил строки, использующие putText, rectangle и circle, чтобы импортировать их из 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 Studio.

Я был бы признателен за любую помощь в этом отношении, я пытался некоторое время, но я не мог решить ее.

1 ответ

Я понял. Хотя понятия не имею, ПОЧЕМУ....

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

...

меня устраивает.

Другие вопросы по тегам