2014-12-07 11 views
10

Próbuję dostać OpenCV bieg używam następujących sample codeOpenCV 3.0.0 FaceDetect Próbka nie

dostaję wyświetlony następujący wiersz Błąd:

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) 

Czy każdy podmiot może mi powiedzieć, co to błąd oznacza lub jak to debugować?

Odpowiedz

7

Zdarza się to zazwyczaj z dwóch powodów.

  1. Kaskadowy plik klasyfikatora lbpcascade_frontalface.xml nie występuje w podanej ścieżce.
  2. Plik klasyfikatora kaskadowego jest uszkodzony.

Aby uzyskać komunikat o błędzie zamiast wyjątku w czasie wykonywania, wypróbuj przykład kodu jak poniżej. CascadeClassifierconstructor jest cichy, jeśli nie może załadować klasyfikatora kaskadowego XML. Spoczywa na dewelopera wywołać metodę empty() i sprawdzić, czy klasyfikator jest prawidłowo załadowany

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

Wyjątek masz to od natywnego kodu OpenCV twierdzenie here.

+0

Dzięki, że jest lepiej brakuje mi przeliterowanej ścieżki do xml: S, ale teraz mam problem, że nie powiedzie się na tej linii: https://github.com/Itseez/opencv/blob/master/modules/cor e/src/ocl.cpp # L3961 – maxbit89

+0

@ maxbit89 Przepraszamy. Nie mogłem nic na to poradzić. Pomocne może być oddzielne pytanie z większą ilością szczegółów. – Kiran

+0

Oto nowe pytanie, które może pomóc w nadziei: S http://stackoverflow.com/questions/27346517/open-cv-3-0-0-face-detection-detectmultiscale-fails – maxbit89

5

Wystąpił ten sam błąd w systemie Windows. Ten przykład działa na systemie Linux, ale nie w systemie Windows.

Problem dotyczy wywołania .getPath() po zarówno dla pliku xml, jak i obrazu.

Problem polega na tym, że zarówno URL.getPath(), jak i URL.getFile() zwracają bezwzględną ścieżkę formatu "/ c:/...".

Procedury OpenCV dławią się tym, że musi to być "c:/..." (bez wiodącego "/"). Wydaje się, że jest to błąd na początku wersji 3.0.0?

Mam nadzieję, że to pomoże, OpenCV dla Javy wydaje się doskonałym narzędziem ... ale to trochę frustrujące, gdy przykłady nie działają.

18

Ja także stanąłem w obliczu problemu. Problem polega na tym, że metoda .getPath() zwraca bezwzględną ścieżkę formatu.

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

Zmień taki kod.

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

to powinno być odpowiedzią, jeśli używasz opecv 3.0.0 –

+0

to powinno być odpowiedzią podczas używania opencv 3 –

1

istnieje problem z najnowszej OpenCV nie działa whn masz spacji w ścieżce tak to zrobić:

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

wpadłem na tej samej kwestii: W systemie Windows, dławiki OpenCV na obu przedrostkach "\" i na białych znakach na ścieżce, jak zauważyli zarówno Imad, jak i Aung.Moje rozwiązanie jest nieco krótsza niż Imad użytkownika:

Zmień to:

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

do tego:

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

Dla mnie najprostszym rozwiązaniem było:

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); 
}