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

标签 java android xml opencv haar-classifier

我想在我的应用程序中使用面部和眼睛分类器。这个概念是复制你在 Resources.Raw 下的分类器 xml 文件的内容,并使用 InputStreamOutputStream 将它们添加到应用程序下的某个文件夹,然后尝试加载该文件夹中的这些分类器,以便在应用程序中使用它们。为此,我正在使用此处提供的代码,

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

这是加载分类器的代码部分:

 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 for Android V 3.1。我也试过下载最新的SDK构建工具,但并没有解决问题。项目。

谁能告诉我如何解决这个问题?

谢谢。

最佳答案

此问题已得到解答here

这是 OpenCV v3.1 中的一个错误,您需要做的就是修改您的代码如下;

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

      mJavaDetectorEye = new CascadeClassifier(
                    cascadeFileER.getAbsolutePath());
      mJavaDetectorEye.load(cascadeFileER.getAbsolutePath());

关于java - 无法在 OpenCV for Android 中加载分类器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34963986/

相关文章:

android - 跨平台套接字库 - Android 和 IOS

android - Eclipse Indigo 无法导入在命令行上构建正常的 maven android

android - Android API中有SD卡的唯一标识符吗?以及如何获得呢?

java - Android ListView显示位置错误

android - Edittext下划线不会消失

Java 泛型 - 覆盖返回 set<T> 的函数

java - 如何*正确*请求权限?

java - 在通过 Socket 接收数据时设置超时

java - Java 中的 XML 空格格式

java - 使用 intellij 运行时单元测试中的系统属性