Ошибка OpenCV 3.0.0 FaceDetect

Я пытаюсь запустить OpenCV, я использую следующие пример кода

Появляется следующая строка ошибки:

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)

Может ли любое тело сказать мне, что означает эта ошибка или как отладить это?

Ответ 1

Это происходит обычно по двум причинам.

  • Файл классификатора каскадов lbpcascade_frontalface.xml отсутствует на указанном пути.
  • Файл классификатора каскадов поврежден.

Чтобы получить сообщение об ошибке вместо исключения во время выполнения, попробуйте пример кода, как показано ниже. Конструктор CascadeClassifier не работает, если он не может загрузить XML-код каскадного классификатора. При этом разработчик должен вызвать метод empty() и проверить, правильно ли загружен классификатор.

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

Исключено, что вы получили от исходного кода OpenCV здесь.

Ответ 2

Я также столкнулся с проблемой. Проблема в .getPath() возвращает абсолютный путь формата.

Например: "/C:/Users/projects/FaceDetection/bin/com/face/detection/haarcascade_frontalface_alt.xml".

Так измените код, как это.

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

Ответ 3

Я столкнулся с этой же ошибкой, запущенной в окне Windows. Этот пример работает в Linux, но не в Windows.

Проблема заключается в вызове .getPath() после getResource() для файла xml и изображения.

Проблема заключается в том, что URL.getPath() и URL.getFile() возвращают абсолютный путь в формате "/c:/...".

Подпрограммы OpenCV захлебываются, это должно быть "c:/..." (нет ведущего "/" ). Это похоже на ошибку в начале версии 3.0.0?

Надеюсь, это поможет, OpenCV для Java кажется отличным инструментом... но это немного разочаровывает, когда примеры не работают.

Ответ 4

есть проблема с последним openCV, он не работает, у вас есть пробелы в вашем пути, поэтому сделайте следующее:

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

Ответ 5

Я столкнулся с одной и той же проблемой: в окнах OpenCV дросселирует как предварительные "\", так и любые пробелы в пути, как отмечали Имад и Аунг. Мое решение немного короче, чем у Имада:

Измените это:

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

Для этого:

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

Ответ 6

Для меня самым простым решением было:

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