OpenCV 3.0.0 FaceDetect示例失败

时间:2014-12-07 16:19:15

标签: java opencv

我正在尝试让OpenCV运行我正在使用以下内容 sample code

我显示以下错误行:

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)

任何机构都可以告诉我该错误的含义或如何调试吗?

9 个答案:

答案 0 :(得分:19)

我也遇到了这个问题。问题出在.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 :(得分:7)

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

  1. 级联分类器文件lbpcascade_frontalface.xml在指定路径中不存在。
  2. 级联分类器文件已损坏。
  3. 要在运行时获取错误消息而不是异常,请尝试使用以下代码示例。如果CascadeClassifier constructor无法加载级联分类器XML,则它是静默的。开发人员有责任调用empty()方法并检查分类器是否正确加载

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

    您获得的异常来自OpenCV本机代码断言here

答案 2 :(得分:5)

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

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

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我遇到了同样的问题:在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", " "));

答案 5 :(得分: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);
}

答案 6 :(得分:0)

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

[
  {
    "@type": "Element_Lists",
    "Name": "Some_Element_Name",
    "Description": "Some_Element_Description",
    "URL": "Some_Element_URL"
  }
]

答案 7 :(得分:0)

我在Mac(OSX)Java上遇到了问题。

    CameraFrame.class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(1) 
returned "Users/username/Desktop/JavaProjects/Camera/bin/haarcascade_frontalface_alt.xml".

而路径应以"/"开头,因此我附加了"/"

    face = new CascadeClassifier("/" + 
CameraFrame.class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(1));

现在可以正常使用:)

答案 8 :(得分:0)

我也面临着同样的问题。仅仅是因为您为“ haarcascade_frontalface_alt2.xml”提供的路径可能不正确或不正确。只需从文件资源管理器复制完整路径并粘贴即可。此解决方案对我有用。

face_cascade = cv2.CascadeClassifier('C:/Users/xyz/FaceDetect/faceId/OpenCV-Python-Series-master/src/cascades/data/haarcascade_frontalface_alt2.xml')