Java 无法在OpenCV for Android中加载分类器

Java 无法在OpenCV for Android中加载分类器,java,android,xml,opencv,haar-classifier,Java,Android,Xml,Opencv,Haar Classifier,我想在我的应用程序中使用人脸和眼睛分类器。其概念是复制Resources.Raw下的分类器xml文件的内容,并使用InputStream和OutputStream将其添加到应用程序下的某个文件夹中,然后尝试从该文件夹加载这些分类器,以便在应用程序中使用。我使用这里的代码来实现这个目的 以下是加载分类器的代码部分: try { // load cascade file from application resources Inpu

我想在我的应用程序中使用人脸和眼睛分类器。其概念是复制Resources.Raw下的分类器xml文件的内容,并使用
InputStream
OutputStream
将其添加到应用程序下的某个文件夹中,然后尝试从该文件夹加载这些分类器,以便在应用程序中使用。我使用这里的代码来实现这个目的

以下是加载分类器的代码部分:

 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()) {
                    Toast.makeText(getApplicationContext(), "face classifier error", Toast.LENGTH_LONG).show();
                    Log.e(TAG, "Failed to load cascade face classifier");
                    mJavaDetector = null;
                } else
                    Log.i(TAG, "Loaded cascade classifier from "
                            + mCascadeFile.getAbsolutePath());

                mJavaDetectorEye = new CascadeClassifier(
                        cascadeFileER.getAbsolutePath());
                if (mJavaDetectorEye.empty()) {
                    Toast.makeText(getApplicationContext(), "eye classifer error", Toast.LENGTH_LONG).show();
                    Log.e(TAG, "Failed to load cascade eye classifier");
                    mJavaDetectorEye = null;
                } else
                    Log.i(TAG, "Loaded cascade classifier from "
                            + mCascadeFile.getAbsolutePath());



                cascadeDir.delete();

            } catch (IOException e) {
                e.printStackTrace();
                Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);
            }
运行应用程序时,我在logcat中收到以下两条错误消息:

Failed to load cascade face classifier

Failed to load cascade eye classifier
从代码中可以看出,只有在加载分类器时出现问题时才会生成这些

我使用的是Android Studio和OpenCV,适用于Android V3.1。我还尝试下载最新的SDK构建工具,但这并没有解决问题。项目

谁能告诉我怎么解决这个问题吗


谢谢

opencv4android v3.1中有一个bug。如果您使用intead 2.4.11版本,它应该可以工作。我还没有尝试过3.0版本,所以它可能可以工作


关于

opencv4android v3.1中有一个bug。如果您使用intead 2.4.11版本,它应该可以工作。我还没有尝试过3.0版本,所以它可能可以工作


关于

这个问题已经得到了回答

这是OpenCV v3.1中的一个bug,您需要做的就是修改代码,如下所示

     mJavaDetector = new CascadeClassifier(
                            mCascadeFile.getAbsolutePath());
     mJavaDetector.load(mCascadeFile.getAbsolutePath());


这个问题已经回答了

这是OpenCV v3.1中的一个bug,您需要做的就是修改代码,如下所示

     mJavaDetector = new CascadeClassifier(
                            mCascadeFile.getAbsolutePath());
     mJavaDetector.load(mCascadeFile.getAbsolutePath());


你是对的,我做到了,效果很好,谢谢你的回答。你是对的,我做到了,效果很好,谢谢你的回答。