OpenCV 3.0.0人脸检测示例失败

13

我正在尝试让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)

有人能告诉我那个错误是什么意思,或者如何调试它吗?

9个回答

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
如果您正在使用opecv 3.0.0,则应返回以下已翻译的文本。 - Eduardo Dennis
当使用OpenCV 3时,这应该是答案。 - Guy Levin

7
这通常出现两个原因:
  1. 级联分类器文件 lbpcascade_frontalface.xml 在指定路径不存在。
  2. 级联分类器文件已损坏。
为了在运行时获得错误消息而不是异常,请尝试以下代码示例。如果无法加载级联分类器XML,则 CascadeClassifier 构造函数 会保持静默。开发人员需要调用 empty() 方法并检查分类器是否正确加载。
CascadeClassifier cascade = new CascadeClassifier( CASCADE_CLASSIFIER_PATH );
if ( cascade.empty() ) {
    //handler error here
}

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


谢谢,现在好了。我拼错了XML路径:S,但现在我遇到的问题是它在这一行失败了:https://github.com/Itseez/opencv/blob/master/modules/core/src/ocl.cpp#L3961 - maxbit89
@maxbit89 对不起。我无法帮忙。更详细的分开提问可能会有所帮助。 - kiranpradeep
这是一个新的问题,希望能有所帮助 :S http://stackoverflow.com/questions/27346517/open-cv-3-0-0-face-detection-detectmultiscale-fails - maxbit89

5
我在Windows平台上遇到了同样的错误。这个示例在Linux上可以运行,但在Windows上却不能。
问题出在获取xml文件和图像后,使用.getPath()调用时。
问题是URL.getPath()URL.getFile()都返回格式为“/c:/…”的绝对路径。
OpenCV例程无法处理这种格式,必须为“c:/…”(没有前导'/')。这似乎是3.0.0版本早期存在的一个bug?
希望这可以帮到你。OpenCV for Java看起来是一个很好的工具...但当示例无法工作时,会有点令人沮丧。

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

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

现在它可以正常工作了 :)


0

我正在使用openCv 3.4.1版本。我认为CascadeClassifier初始化器中存在一个错误。为了消除这个错误,我必须再次调用“load”函数。希望这个解决方案能够帮到你。

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

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

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')

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接