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不存在于指定路径中。
  2. 级联分类器文件已损坏。

要在运行时获取错误消息而不是exception,请尝试下面的代码示例。 如果CascadeClassifier 构造函数无法加载级联分类器XML,则它是静默的。 开发人员有责任调用empty()方法并检查分类器是否正确加载

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

您获得的exception来自OpenCV本机代码断言。

我也遇到了这个问题。 问题是在.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)); 

我遇到了在Windows机器上运行的同样错误。 此示例在Linux上运行,但不在Windows上运行。

问题出在对xml文件和图像的getResource()之后的.getPath()调用中。

问题是URL.getPath()URL.getFile()都返回格式为“/ c:/ …”的绝对路径。

OpenCV例程阻塞它必须是“c:/ …”(没有前导’/’)。 这似乎是版本3.0.0早期的一个错误?

我希望这会有所帮助,OpenCV for Java似乎是一个很棒的工具……但是当示例不起作用时,它有点令人沮丧。

最新的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()); 

我遇到了同样的问题:在Windows上,OpenCV在前面的’\’和路径中的任何空格上都会窒息,正如Imad和Aung都注意到的那样。 我的解决方案比Imad的简短:

改变这个:

 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", " ")); 

对我来说,最简单的解决方案是:

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

我正在使用openCv 3.4.1我认为CascadeClassifier初始化程序中存在一个错误。 为了摆脱这个错误,我必须再次调用“加载”。 希望这个解决方案有所帮助

 cascadeClassifier = new CascadeClassifier(mCascadeFile.getAbsolutePath()); cascadeClassifier.load(mCascadeFile.getAbsolutePath());