【问题标题】:OpenCV 3.0.0 FaceDetect Sample failsOpenCV 3.0.0 FaceDetect 示例失败
【发布时间】:2015-02-05 07:49:47
【问题描述】:

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

谁能告诉我这个错误是什么意思或如何调试它?

【问题讨论】:

    标签: java opencv


    【解决方案1】:

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

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

    要在运行时获取错误消息而不是异常,请尝试以下代码示例。 CascadeClassifier constructor 是静默的,如果它不能加载级联分类器 XML。开发者有责任调用empty() 方法并检查分类器是否正确加载

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    OpenCV 例程对此感到窒息,它必须是“c:/...”(没有前导 '/')。这似乎是 3.0.0 早期版本的一个错误?

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 如果您使用的是 opecv 3.0.0,这应该是答案
      • 这应该是使用opencv 3时的答案
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题:正如 Imad 和 Aung 所指出的,在 Windows 上,OpenCV 会阻塞前面的 '\' 和路径中的任何空格。我的解决方案比 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", " "));
        

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

              现在可以正常使用了:)

              【讨论】:

                【解决方案9】:

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

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

                【讨论】:

                  猜你喜欢
                  • 2011-12-30
                  • 2016-01-01
                  • 2016-01-28
                  • 2017-06-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-02-02
                  相关资源
                  最近更新 更多