Java OpenCV 3.0.0 FaceDetect样本失败

Java OpenCV 3.0.0 FaceDetect样本失败,java,opencv,Java,Opencv,我正在尝试运行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.co

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

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

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

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

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

    您得到的异常来自OpenCV本机代码断言。

    我在Windows框上运行时遇到了相同的错误。此示例在linux上运行,但在Windows上不运行

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

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

    在此基础上的OpenCV例程必须是“c:/…”(无前导“/”)。这似乎是版本3.0.0早期的一个bug


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

    我也遇到了这个问题。问题在于.getPath()返回格式的绝对路径

    例如:“/C:/Users/projects/FaceDetection/bin/com/face/detection/haarcascade\u frontalface\u alt.xml”

    所以像这样修改代码

    CascadeClassifier faceDecetor = new CascadeClassifier(FaceDetection.class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(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());
    
    String s=CameraPanel.class.getResource(“lbpcascade_frontalface.xml”).getPath().substring(1);
    字符串[]split=s.split(“%20”);
    StringBuilder StringBuilder=新的StringBuilder();
    对于(int i=0;i
    我遇到了同样的问题:在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 我认为初始化器中有一个bug。 为了消除这个错误,我必须再次调用“load”。希望这个解决方案能有所帮助

    cascadeClassifier = new CascadeClassifier(mCascadeFile.getAbsolutePath());
    cascadeClassifier.load(mCascadeFile.getAbsolutePath());
    
    我在Mac(OSX)Java上遇到了问题

    然而路径应该以
    “/”
    开头,因此我添加了
    “/”


    现在一切正常:)

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

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

    谢谢,这样更好,我没有拼写到xml:S的路径,但现在我有一个问题,它在这一行失败:@maxbit89对不起。我没办法。带更多细节的单独问题可能会有所帮助。下面是一个新问题希望这有帮助:S如果您使用的是opecv 3.0.0,这应该是答案。这应该是使用opecv 3时的答案
        face = new CascadeClassifier("/" + 
    CameraFrame.class.getResource("haarcascade_frontalface_alt.xml").getPath().substring(1));
    
    face_cascade = cv2.CascadeClassifier('C:/Users/xyz/FaceDetect/faceId/OpenCV-Python-Series-master/src/cascades/data/haarcascade_frontalface_alt2.xml')