【问题标题】:Python OpenCV error with CascadeClassifier带有 CascadeClassifier 的 Python OpenCV 错误
【发布时间】:2019-12-03 22:24:52
【问题描述】:
import cv2
import imageio

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

def detect(frame):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for(x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
        gray_face = gray[y:y+h, x:x+w]
        color_face = frame[y:y+h, x:x+w]
        eyes = eye_cascade.detectMultiScale(gray_face, 1.1, 3)
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(color_face, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
    return frame

reader = imageio.get_reader('1.mp4')
fps = reader.get_meta_data()['fps']
writer = imageio.get_writer('output.mp4', fps=fps)
for i, frame in enumerate(reader):
    frame = detect(frame)
    writer.append_data(frame)
    print(i)
writer.close()
Traceback (most recent call last):
  File "C:/Users/Mustafa Koca/PycharmProjects/mustafakoca/face_det.py", line 23, in <module>
    frame = detect(frame)
  File "C:/Users/Mustafa Koca/PycharmProjects/mustafakoca/face_det.py", line 9, in detect
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
cv2.error: OpenCV(4.1.2) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'

【问题讨论】:

    标签: python python-3.x machine-learning deep-learning deeplearning4j


    【解决方案1】:

    xml 文件不在当前文件夹中,而是在 cv2 模块的某个文件夹中,您必须使用完整路径来加载它们。

    幸运的是文件夹名称有特殊变量 - cv2.data.haarcascades

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

    为了确保您可以使用os.path.join() 而不是+

    face_cascade = cv2.CascadeClassifier(os.path.join(cv2.data.haarcascades, 'haarcascade_frontalface_default.xml'))
    eye_cascade = cv2.CascadeClassifier(os.path.join(cv2.data.haarcascades, 'haarcascade_eye.xml'))
    

    如果加载了xml 文件,那么这应该给出False

    print(face_cascade.empty())
    print(eye_cascade.empty())
    

    【讨论】:

    • 谢谢你,它有效 :) 你能解释一下这里的目标吗?
    • 正如我在回答的第一行中所写的那样:当您仅使用文件名时,它会使用代码在您的文件夹中搜索此文件。但文件位于不同的文件夹中 - 请参阅print(cv2.data.haarcascades)。您可以创建自己的文件 .xml 或从 Internet 下载并将其放入包含您的代码的文件夹中,然后您可以使用它来代替模块 cv2 可用的文件,并且您不必使用完整路径。
    • 你可以在任何你想要的地方使用print(cv2.data.haarcascades) - 但在import cv2之后。您甚至不必在代码中使用它。您可以打开 Python shell 并运行它import cv2、print(cv2.data.haarcascades) 只检查一次。
    • 感谢除了代码工作之外,所以我解决了这个问题,但现在数字将在它不再给出结果时结束
    • 在 SO 中很简单 - 如果您有新问题,请在新页面上创建新问题。这样你也将有更多的空间来描述新问题。
    猜你喜欢
    • 2021-12-28
    • 2013-05-03
    • 2014-09-18
    • 2019-06-13
    • 2021-11-02
    • 2023-04-03
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多