【问题标题】:ERROR: !empty() in function 'detectMultiScale'错误:函数 'detectMultiScale' 中的 !empty()
【发布时间】:2020-12-04 23:53:27
【问题描述】:

我有以下小代码:

from google.colab import drive
from IPython.display import display
import PIL
from PIL import Image, ImageDraw
import kraken
from kraken import pageseg
import cv2 as cv

img = Image.open("/content/drive/My Drive/images/dropfire.jpg")

face_cascade = cv.CascadeClassifier(cv.data.haarcascades + "/content/drive/My Drive/datas/haarcascade_frontalface_default.xml")
eye_cascade = cv.CascadeClassifier(cv.data.haarcascades + "/content/drive/My Drive/datas/haarcascade_eye.xml")

file_name = "/content/drive/My Drive/images/dropfire.jpg"
img = cv.imread(file_name)
pil_img = Image.open(file_name)
cv_img = pil_img.convert('L')
cv_img = cv.imread(file_name)

faces = face_cascade.detectMultiScale(cv_img)

当我运行最后一个单元格(faces)时,它会引发:

error                                     Traceback (most recent call last)
<ipython-input-23-2bd7582f8a20> in <module>()
----> 1 faces = face_cascade.detectMultiScale(cv_img)

error: OpenCV(4.1.2) /io/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'

直到这个单元格一切正常。根据堆栈溢出answer,我在cv.CascadeClassifier 的括号中添加了cv.data.haarcascades + 。尽管人们说这对他们有用,但不知何故对我不起作用。

【问题讨论】:

  • 您必须添加cv.data.haarcascades 但不添加/content/drive/My Drive/datas - 才能读取预装cv2 的文件。如果你在/content/drive/My Drive/datas 中有它,那么不要添加cv.data.haarcascades。只需使用print(cv.data.haarcascades + "/content/drive/My Drive/datas/haarcascade_eye.xml") 即可查看您是否创建了正确的路径。
  • 也许首先检查您是否使用正确的图像路径 /content/drive/My Drive/images/dropfire.jpg 。 CV2 imread() 在您使用错误路径时不会引发错误,但它会返回空数据 - 检查 print(cv_img) - 稍后当您尝试在其他功能中使用此图像时会引发错误 - 例如 detectMultiScale(cv_img)
  • @furas /usr/local/lib/python3.6/dist-packages/cv2/data//content/drive/My Drive/datas/haarcascade_eye.xml 这是我运行时得到的print(cv.data.haarcascades + "/content/drive/My Drive/datas/haarcascade_eye.xml")
  • @furas 另外,我显示了图像并且效果很好......
  • 这是正确的路径吗?你在磁盘上有/usr/local/lib/python3.6/dist-packages/cv2/data//content/drive/My Drive/datas/haarcascade_eye.xml - 可能没有。你可能有/usr/local/lib/python3.6/dist-packages/cv2/data/haarcascade_eye.xml(即cv.data.haarcascades + "haarcascade_eye.xml")和/或/content/drive/My Drive/datas/haarcascade_eye.xml(如果你下载的话)

标签: python opencv python-imaging-library cv2


【解决方案1】:

恕我直言,您的“小代码”已经有太多噪音(不必要的代码行)。 我认为这会让你更难理解发生了什么。

注释掉/删除除这些之外的所有行:

    import cv2 as cv
    
    face_cascade = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_frontalface_default.xml")
    eye_cascade = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_eye.xml")

    file_name = "/content/drive/My Drive/images/dropfire.jpg"
    img = cv.imread(file_name)  # this reads the image already
    
    cv_img = cv.imread(file_name) # this reads same image once more, not sure if intended
    faces = face_cascade.detectMultiScale(cv_img)  

如果您的图像“dropfire”确实存在于该路径中,这应该可以正常工作,但不会显示任何人脸检测结果。您可以在末尾添加这些行以查看结果:

    for (x, y, w, h) in faces:
        cv.rectangle(cv_img, (x, y), (x+w, y+h), (0, 0, 255), 3)
    cv.imshow("Nice face", cv_img)
    cv.waitKey(0)

cv.data.haarcascades 已经有了所有这些 cv2 xml 文件的路径,所以你只需要使用文件名。

【讨论】:

    【解决方案2】:

    问题是检查是否加载了 XML,使用 eye_cascade.empty() 检查是否已加载。

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 2019-06-04
      • 2015-08-11
      • 2021-06-30
      • 1970-01-01
      • 2018-05-24
      • 2022-06-22
      相关资源
      最近更新 更多