Questa è la prima volta che utilizzo la libreria openCV. Voglio usarlo per rilevare gli occhi. Ho usato il codice FdActivity
disponibile in questo tutorial:OpenCV per Android: impossibile caricare l'errore di classificazione cascade
http://romanhosek.cz/android-eye-detection-updated-for-opencv-2-4-6/
Il tutorial utilizza OpenCV 2.4.6, ma ho scaricato la versione 3.1 nel mio progetto. A causa delle differenze di versione, ho modificato le linee che usano putText, rectangle e circle per essere importate da imgproc invece che da Core. Questo è tutto ciò che ho cambiato. Ho aggiunto haarcascade_lefteye_2splits.xml e lbpcascade_frontalface.xml nella cartella raw nella cartella res.
Quando si esegue l'applicazione ottengo questo errore nel logcat:
failed to load cascade classifier
che viene generato solo da queste linee se mJavaDetector o mJavaDetectorEye è vuoto:
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();
}
Credo che il percorso "haarcascade_eye_right.xml" non è corretto, oppure il file xml non esiste, è questo che sta causando l'errore?
Se sì, come posso avere il file xml e dove esattamente lo memorizzerò? Se no, qual è la causa del problema?
Nota: utilizzo Android Studio.
Apprezzerei qualsiasi aiuto in questo senso, ci ho provato per un po ', ma non ho potuto risolverlo.
sì, questo è sicuramente un bug, specificare un percorso dovrebbe già chiamare load(). grazie per avermi salvato ore! –
omg, non posso ringraziarti abbastanza @william Liu ... trascorrendo ore e ore su questo, rispetto agli esempi in github e tutto, e infine è un bug di tipo opencv .... grazie William. :-) – Santosh
stupido opencv ... – user25