Android 无法在 OpenCV 中加载分类器
Unable to load classifier in OpenCV for Android
我想在我的应用程序中使用面部和眼睛分类器。这个概念是复制你在Resources.Raw下的分类器xml文件的内容,并使用InputStream
和OutputStream
将它们添加到应用程序下的某个文件夹,然后尝试加载该文件夹中的这些分类器,以便在应用程序中使用它们。为此,我正在使用此处提供的代码,
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,以及 Android V 3.1 的 OpenCV。我也试过下载最新的SDK构建工具,但并没有解决问题。项目。
谁能告诉我如何解决这个问题?
谢谢。
opencv4 android v3.1 中存在错误。如果您改用 2.4.11 版本,它应该可以工作。 3.0版本我没试过,应该可以吧
此致
这个问题已经回答here
这是OpenCV v3.1中的一个bug,您需要做的就是修改您的代码如下;
mJavaDetector = new CascadeClassifier(
mCascadeFile.getAbsolutePath());
mJavaDetector.load(mCascadeFile.getAbsolutePath());
和
mJavaDetectorEye = new CascadeClassifier(
cascadeFileER.getAbsolutePath());
mJavaDetectorEye.load(cascadeFileER.getAbsolutePath());
我想在我的应用程序中使用面部和眼睛分类器。这个概念是复制你在Resources.Raw下的分类器xml文件的内容,并使用InputStream
和OutputStream
将它们添加到应用程序下的某个文件夹,然后尝试加载该文件夹中的这些分类器,以便在应用程序中使用它们。为此,我正在使用此处提供的代码,
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,以及 Android V 3.1 的 OpenCV。我也试过下载最新的SDK构建工具,但并没有解决问题。项目。
谁能告诉我如何解决这个问题?
谢谢。
opencv4 android v3.1 中存在错误。如果您改用 2.4.11 版本,它应该可以工作。 3.0版本我没试过,应该可以吧
此致
这个问题已经回答here
这是OpenCV v3.1中的一个bug,您需要做的就是修改您的代码如下;
mJavaDetector = new CascadeClassifier(
mCascadeFile.getAbsolutePath());
mJavaDetector.load(mCascadeFile.getAbsolutePath());
和
mJavaDetectorEye = new CascadeClassifier(
cascadeFileER.getAbsolutePath());
mJavaDetectorEye.load(cascadeFileER.getAbsolutePath());