【问题标题】:error: (-215) !empty() in function detectMultiScale错误:(-215) !empty() in function detectMultiScale
【发布时间】:2015-08-11 02:25:10
【问题描述】:

我正在尝试在 python 2.7 中学习 cv2,但是当我运行我的代码时,在它的特定部分:

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
 eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')


img = cv2.imread('2015-05-27-191152.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

它返回这个:

File "face_detection.py", line 11, in <module>
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
cv2.error: /home/arthurckl/Desktop/opencv-3.0.0-rc1/modules/objdetect/src/cascadedetect.cpp:1595: error: (-215) !empty() in function detectMultiScale

我试图在这里搜索答案,但我能找到的最好的结果是我必须以错误的方式加载 face_cascade...有什么帮助吗?

【问题讨论】:

  • 找不到您的 xml 文件。尝试像“/my/files/bla/cacade.xml”这样的绝对路径
  • @berak 我将原始路径替换为您建议的路径,但代码返回相同的错误
  • 您能否通过添加测试或图像显示来验证您的图像是否为空(例如,如果未正确加载)?
  • 哦,我明白了,我把 fila 路径写错了。感谢您的帮助!
  • 我有同样的问题,无论我多么努力,我都无法解决它。你能告诉我们你是怎么解决的吗? @arthurckl

标签: python python-2.7 opencv image-recognition


【解决方案1】:

路径需要以/ 开头,例如。 /file.xml.

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并试图在我的 xml 文件和图像位于资源文件夹中的 springboot 应用程序中使用 open cv。 尝试给出从 src 开始的路径或像 C:\a\b.xml 这样的绝对路径不起作用。

    使用项目根路径动态创建文件路径。

    String classifierPath = System.getProperty("user.dir") + "/src/main/resources/haarcascades/haarcascade_frontalface.xml";
    
    // similarly for image paths
    

    【讨论】:

      【解决方案3】:

      这似乎是文件路径问题。我改变了这样的代码并且它起作用了。

      haar_face_filename = "D:\Sandbox\Github\Faces\haar_face.xml"
      haar_cascade = cv.CascadeClassifier(haar_face_filename)
      

      【讨论】:

        【解决方案4】:

        当您没有定义 XML 文件的完整路径时,您可能会发现此类错误。 如果你在 raspberrypi 3 中使用 opencv3.1.0,试试这个:

        faceCascade = cv2.CascadeClassifier('/home/pi/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_default.xml')

        【讨论】:

          【解决方案5】:

          我遇到了类似的问题。似乎更正 XML 的路径会使这个错误消失。

          【讨论】:

          • 欢迎来到 SO。尽管我们感谢您的回答,但如果它在其他答案之上提供额外的价值会更好。在这种情况下,您的答案不会提供额外的价值,因为已经有很多答案提到了更改 XML 的路径。
          【解决方案6】:

          你只需要添加haarcascade_frontalface_default.xml文件的正确路径你只需要添加前缀(cv2.data.haarcascades

          face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
          eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
          

          【讨论】:

            【解决方案7】:

            我在其他答案中发现了这一点,但当我添加了两个答案时,最终对我有用。

            import cv2
            from matplotlib import pyplot as plt
            import numpy as np
            face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
            eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_eye.xml")
            
            img = cv2.imread('image1.jpg')
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            faces = face_cascade.detectMultiScale(gray, 1.3, 5)
            

            【讨论】:

              【解决方案8】:

              我运行了相同的代码。这里有两点需要注意。 1. 给出 .xml 文件的完整路径。 2.最后给出按键事件指令。

              在最后添加这段代码并运行你的文件,对我有用:

              k = cv2.waitKey(0)
              if k == 27:         # wait for ESC key to exit
                  cv2.destroyAllWindows()
              elif k == ord('s'): # wait for 's' key to save and exit
                  cv2.imwrite('messigray.png',img)
                  cv2.destroyAllWindows()
              

              例如,我的代码看起来像

              import numpy as np
              import cv2
              
              face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
              eye_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_eye.xml')
              
              img = cv2.imread('lena.jpg')
              
              gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
              
              faces = face_cascade.detectMultiScale(gray, 1.3, 5)
              #faces = face_cascade.detectMultiScale(gray)
              
              for (x,y,w,h) in faces:
                  cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
                  roi_gray = gray[y:y+h, x:x+w]
                  roi_color = img[y:y+h, x:x+w]
                  eyes = eye_cascade.detectMultiScale(roi_gray)
                  for (ex,ey,ew,eh) in eyes:
                      cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
              
              cv2.imshow('img',img)
              
              k = cv2.waitKey(0)
              if k == 27:         # wait for ESC key to exit
                  cv2.destroyAllWindows()
              elif k == ord('s'): # wait for 's' key to save and exit
                  cv2.imwrite('messigray.png',img)
                  cv2.destroyAllWindows()
              

              我的输出如下所示:

              【讨论】:

              • 对我来说绝对路径是错误的,必须包含 CWD (C: Drive/projectdirectory/) 即 'C:/Flask/venv/Lib/site-packages/cv2/data/'
              【解决方案9】:

              上面提到的解决方案的主要思想:找到.xml文件的正确路径并使用它来正确访问文件。

              在我的情况下,我在 anconda env 中安装了 opencv,首先直接指向 Anoconda 的路径,然后

              • 找到.xml文件的路径:

                $ find . -name 'haarcascade_eye.xml'(例如在当前目录 (.) 中搜索 haarcascade_eye.xml 文件)

              • 然后使用返回path:

              eye_cascade = cv2.CascadeClassifier(path + 'haarcascade_eye.xml')

              【讨论】:

                【解决方案10】:

                您可以通过将 XML 放置在您的主要 python 文件(您尝试包含此文件的位置)所在的同一目录中来解决此问题。现在下一步是使用完整路径。例如

                这行不通

                front_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')
                

                使用完整路径,现在可以正常工作了

                front_cascade = cv2.CascadeClassifier('/Users/xyz/Documents/project/haarcascade_eye.xml')
                

                【讨论】:

                  【解决方案11】:

                  我遇到了同样的问题。但写的是正确的位置。

                  face_cascade = cv2.CascadeClassifier('./model/haarcascade_frontalface_default.xml')
                  

                  我发现我需要声明完整路径才能消除错误。

                  face_cascade = cv2.CascadeClassifier('C:/pythonScript/Facial-Emotion-Detection/model/haarcascade_frontalface_default.xml')
                  

                  【讨论】:

                  【解决方案12】:

                  我遇到了同样的问题。

                  我不需要下载任何其他东西来解决这个问题。 CV2 拥有我需要的一切。

                  我没有尝试找出 .xml 文件的位置并对值进行硬编码,而是使用了 cv2 给出的属性。

                  来自 OP

                  face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
                  eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
                  

                  变成

                  face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
                  eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
                  

                  【讨论】:

                  • 这应该被标记为正确答案,这样可以节省我的时间。
                  • 效果很好,应该标记为正确
                  • @VIVID 遇到了什么错误?是使用 cv2.data.haarcascades 还是使用 cv2.CascadeClassifie?
                  • @Mandelbrotter 这是我的问题:stackoverflow.com/questions/63423843/…
                  • 谢谢你,这让我避免了数周的头痛
                  【解决方案13】:

                  此错误表示找不到 XML 文件。该库需要您将完整路径传递给它,即使您可能只是使用 OpenCV 库附带的文件。

                  您可以使用内置的pkg_resources module 自动为您确定这一点。下面的代码会查找在其中加载了 cv2 模块的文件的完整路径:

                  import pkg_resources
                  haar_xml = pkg_resources.resource_filename(
                      'cv2', 'data/haarcascade_frontalface_default.xml')
                  

                  对我来说这是'/Users/andrew/.local/share/virtualenvs/foo-_b9W43ee/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml';你的保证是不同的。让 python 的pkg_resources 库来解决吧。

                  classifier = cv2.CascadeClassifier(haar_xml)
                  faces = classifier.detectMultiScale(frame)
                  

                  成功了!

                  【讨论】:

                    【解决方案14】:

                    无需修改代码

                    下载那个.xml文件,然后输入那个文件的路径

                    它会解决错误(100%)

                    【讨论】:

                      【解决方案15】:

                      opencv-python 遇到了同样的问题,我使用了虚拟环境。 如果是您的情况,您应该在以下位置找到 xml 文件:

                      /home/username/virtual_environment/lib/python3.5/site-packages/cv2/data/haarcascade_frontalface_default.xml

                      /home/username/virtual_environment/lib/python3.5/site-packages/cv2/data/haarcascade_eye.xml

                      请确保您使用的是绝对路径。否则,它将不起作用。

                      【讨论】:

                        【解决方案16】:

                        "\Anaconda3\Lib\site-packages\cv2\data\" 我在此路径中找到了 Anaconda 的 xml 文件

                        【讨论】:

                          【解决方案17】:

                          请不要复制粘贴xml文件的内容,因为一旦你把它粘贴到记事本中,它就会被保存为一个s文本文件。所以直接从给定的源下载文件。

                          【讨论】:

                            【解决方案18】:

                            该错误是由于缺少 xml 文件或 xml 文件的路径不正确。

                            请尝试以下代码,

                            import numpy as np
                            import cv2
                            
                            face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
                            eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
                            
                            cap = cv2.VideoCapture(0)
                            
                            while 1:
                                ret, img = cap.read()
                                gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                                faces = face_cascade.detectMultiScale(gray, 1.3, 5)
                            
                                for (x,y,w,h) in faces:
                                    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
                                    roi_gray = gray[y:y+h, x:x+w]
                                    roi_color = img[y:y+h, x:x+w]
                            
                                    eyes = eye_cascade.detectMultiScale(roi_gray)
                                    for (ex,ey,ew,eh) in eyes:
                                        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
                            
                                cv2.imshow('img',img)
                                k = cv2.waitKey(30) & 0xff
                                if k == 27:
                                    break
                            
                            cap.release()
                            cv2.destroyAllWindows()
                            

                            【讨论】:

                              【解决方案19】:

                              XML 文件丢失,您可以从 GitHub 存储库中获取该文件并将其放在与您的项目相同的目录中。 GitHub 上文件夹的链接是here。只需下载名为 haarcascade_frontalface_default.xml 的文件。 实际上,该文件存在于您的系统上。只需转到 python 安装文件夹的 site-packages 文件夹并检查 cv2/data 文件夹中的文件

                              【讨论】:

                                【解决方案20】:

                                错误可能是由于所需的 xml 文件没有正确加载。使用您操作系统的搜索引擎搜索文件haarcascade_frontalface_default.xml 获取完整路径并将其作为参数作为字符串cv2.CascadeClassifier

                                【讨论】:

                                  【解决方案21】:

                                  在带有自制软件的 OSX 上安装 opencv 文件夹的完整路径应该可以:

                                  face_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/3.4.0_1/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml')
                                  eye_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/3.4.0_1/share/OpenCV/haarcascades/haarcascade_eye.xml')
                                  

                                  注意路径中的版本号。

                                  【讨论】:

                                    【解决方案22】:

                                    face_cascade 可能是空的。您可以通过键入以下命令来检查变量是否为空:

                                    face_cascade.empty()
                                    

                                    如果它为空,您将获得True,这意味着您的文件在您提到的路径中不可用。 尝试添加xml文件的完整路径如下:

                                    r'D:\folder Name\haarcascade_frontalface_default.xml'
                                    

                                    【讨论】:

                                      【解决方案23】:

                                      找不到您的 XML 文件。尝试使用绝对路径,例如:

                                      /path/to/my/file (Mac, Linux)
                                      C:\\path\\to\\my\\file (Windows)
                                      

                                      【讨论】:

                                        【解决方案24】:

                                        如果你使用 Anaconda,你应该添加 Anaconda 路径。

                                        new_path = 'C:/Users/.../Anaconda/Library/etc/haarcascades/'
                                        
                                        face_cascade = cv2.CascadeClassifier(new_path + 'haarcascade_frontalface_default.xml')
                                        

                                        【讨论】:

                                          【解决方案25】:

                                          使用整个文件路径,并在 xml 文件路径中使用“\\”而不是“\”。

                                          文件路径如下:

                                          face_cascade = cv2.CascadeClassifier('C:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml')
                                          

                                          代替:

                                          cascade_fn = args.get('--cascade', "..\..\data\haarcascades\haarcascade_frontalface_alt.xml")
                                          

                                          【讨论】:

                                            【解决方案26】:

                                            XML 或文件丢失或路径不正确或 create_capture 路径不正确。

                                            opencv 示例中的路径如下所示:

                                            cascade_fn = args.get('--cascade', "../../data/haarcascades/haarcascade_frontalface_alt.xml")
                                            nested_fn  = args.get('--nested-cascade', "../../data/haarcascades/haarcascade_eye.xml")
                                            
                                            cam = create_capture(video_src, fallback='synth:bg=../data/lena.jpg:noise=0.05')
                                            

                                            【讨论】:

                                              猜你喜欢
                                              • 2018-05-24
                                              • 2021-11-02
                                              • 2022-06-22
                                              • 2020-05-17
                                              • 2021-06-30
                                              • 1970-01-01
                                              • 2021-04-09
                                              相关资源
                                              最近更新 更多