Ошибка 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);
}