2014-12-07 85 views
10

我想我用得到的OpenCV运行以下 sample codeOpenCV的3.0.0 FaceDetect样品失败

我得到显示以下错误行:

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) 

任何机构可以告诉我那是什么错误意味着如何调试?

回答

7

发生这种情况通常有两个原因。

  1. 级联分类器文件lbpcascade_frontalface.xml不存在于指定的路径。
  2. 级联分类器文件已损坏。

要在运行时获取错误消息而不是异常,请尝试下面的代码示例。如果无法加载级联分类器XML,则CascadeClassifierconstructor处于静默状态。该责任是开发者调用empty()方法,并检查是否分类是否正确装入

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

异常你得到的是来自OpenCV的本地代码断言here

+0

感谢那个比较好我想念拼写到XML:S的路径,但现在我有这个问题,它在这一行失败:https://github.com/Itseez/opencv/blob/master/modules/cor e/src/ocl.cpp#L3961 – maxbit89 2014-12-07 17:48:56

+0

@ maxbit89对不起。我忍不住了。用更多细节分开提问可能会有帮助。 – Kiran 2014-12-07 17:55:46

+0

这里是新的问题希望这有助于:S http://stackoverflow.com/questions/27346517/open-cv-3-0-0-face-detection-detectmultiscale-fails – maxbit89 2014-12-07 19:14:48

5

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

问题出在.getPath()调用getResource()为xml文件和图像。

问题是,URL.getPath()URL.getFile()都返回格式为“/ c:/ ...”的绝对路径。 OpenCV例程在此扼杀它,它必须是“c:/ ...”(不是前导'/')。这似乎是版本3.0.0早期的一个错误?

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

18

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

这应该是答案,如果你正在使用opecv 3.0.0 – 2015-09-11 03:10:14

+0

这应该是使用opencv 3时的答案 – 2016-07-21 15:15:23

1

有与最新的OpenCV的问题WHN你有空间在你的路径,以便做到这一点不起作用:

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

我碰到了同样的问题:在Windows上,OpenCV的扼流圈就像Imad和Aung都注意到的那样,在路径中的前缀'\'和任何空格中。我的解决方案比伊马德的短一点:

更改此:

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

对我来说,最简单的解决办法是:

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