2014-12-07 9 views
10

io sto cercando di ottenere OpenCV esecuzione sto usando il seguente sample codeOpenCV 3.0.0 FaceDetect campione non supera

ottengo la seguente riga di errore visualizzato:

OpenCV Error: Assertion failed (!empty()) in cv::CascadeClassifier::detectMultiScale, file ..\..\..\..\opencv\modules\objdetect\src\cascadedetect.cpp, line 1580 
Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: ..\..\..\..\opencv\modules\objdetect\src\cascadedetect.cpp:1580: error: (-215) !empty() in function cv::CascadeClassifier::detectMultiScale 
] 
    at org.opencv.objdetect.CascadeClassifier.detectMultiScale_1(Native Method) 
    at org.opencv.objdetect.CascadeClassifier.detectMultiScale(CascadeClassifier.java:176) 
    at org.maxbit.opencv.samples.DetectFaceDemo.run(SampleB.java:29) 
    at org.maxbit.opencv.samples.SampleB.main(SampleB.java:51) 

qualsiasi organismo può dirmi cosa che errore significa o come eseguire il debug di questo?

risposta

7

Ciò accade di solito per due motivi.

  1. file di classificatore Cascade lbpcascade_frontalface.xml non presente al percorso specificato.
  2. Il file del classificatore Cascade è danneggiato.

Per ottenere un messaggio di errore invece di un'eccezione durante il runtime, provare l'esempio del codice come di seguito. Il CascadeClassifierconstructor non funziona, se non riesce a caricare il classificatore CSS in cascata. L'onere è lo sviluppatore per chiamare il metodo empty() e verificare se classificatore è stata caricata correttamente

CascadeClassifier cascade = new CascadeClassifier(CASCADE_CLASSIFIER_PATH); 
if (cascade.empty()) { 
    //handler error here 
} 

eccezione che hai è da OpenCV codice di asserzione nativo here.

+0

Grazie che è meglio mi manca scritto il percorso per l'xml: S, ma ora ho il problema che non riesce su questa linea: https://github.com/Itseez/opencv/blob/master/modules/cor e/src/ocl.cpp # L3961 – maxbit89

+0

@ maxbit89 Siamo spiacenti. Non potevo aiutare. Potrebbe essere utile separare la domanda con maggiori dettagli. – Kiran

+0

ecco la nuova domanda spero che questo aiuti: S http://stackoverflow.com/questions/27346517/open-cv-3-0-0-face-detection-detectmultiscale-fails – maxbit89

5

Mi sono imbattuto in questo stesso errore in esecuzione su una casella di Windows. Questo esempio funziona su Linux ma non su Windows.

Il problema è nella chiamata .getPath() dopo getResource() per il file xml e l'immagine.

Il problema è che il URL.getPath() e il URL.getFile() restituiscono entrambi un percorso assoluto del formato "/ c:/...".

Le routine di OpenCV soffocano su questo deve essere "c:/..." (senza iniziali '/'). Questo sembra un bug nella prima parte della versione 3.0.0?

Spero che questo aiuti, OpenCV per Java sembra un ottimo strumento ... ma è un po 'frustrante quando gli esempi non funzionano.

18

Ho anche affrontato il problema. Il problema è nel .getPath() restituisce un percorso assoluto del formato.

Es: "/C:/Users/projects/FaceDetection/bin/com/face/detection/haarcascade_frontalface_alt.xml".

Quindi modificare il codice in questo modo.

CascadeClassifier faceDecetor = new CascadeClassifier(FaceDetection.class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(1)); 
+1

questa dovrebbe essere la risposta se stai usando opecv 3.0.0 –

+0

questa dovrebbe essere la risposta quando si utilizza opencv 3 –

1

c'è un problema con l'ultima OpenCV non funziona whn si dispone di spazi nel vostro percorso in modo da fare questo:

String s =CameraPanel.class.getResource("lbpcascade_frontalface.xml").getPath().substring(1); 
    String[] split = s.split("%20"); 
    StringBuilder stringBuilder = new StringBuilder(); 
    for (int i = 0; i < split.length-1; i++) { 
     stringBuilder.append(split[i]+" "); 
    } 
    stringBuilder.append(split[split.length-1]); 
    faceDetector = new CascadeClassifier(stringBuilder.toString()); 
0

Ho incontrato lo stesso problema: su Windows, bobine d'arresto OpenCV sia sul prefisso '\' che su qualsiasi spazio bianco nel percorso, come hanno notato sia Imad che Aung.La mia soluzione è un po 'più breve di Imad di:

Modifica questo:

CascadeClassifier faceDecetor = new CascadeClassifier(
    getClass().class.getResource("haarcascade_frontalface_alt.xml").getPath()); 

A tal:

CascadeClassifier faceDecetor = new CascadeClassifier(
    getClass().class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(1).replaceAll("%20", " ")); 
0

Per me la soluzione più semplice era:

private void checkboxSelection(String classifierPath) { 
    // load the classifier(s) 
    faceCascade.load(classifierPath); 
    // Did it work? 
    if (faceCascade.empty()) { 
     // Try the full path 
     String resource = getClass().getResource(classifierPath).getPath(); 
     // Discard leading/if present. 
     if (resource.startsWith("/")) { 
      resource = resource.substring(1); 
     } 
     faceCascade.load(resource); 
    } 
    // now the video capture can start 
    cameraButton.setDisable(false); 
}