You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV(-215:Assertion failed)报错,眨眼检测程序运行失败求助

问题原因及解决方法

核心报错(-215:Assertion failed)

该报错的根本原因是代码加载Haar级联分类器的xml文件失败,调用detectMultiScale时分类器对象为空。

解决步骤:

  • 优先使用OpenCV内置的数据集路径加载分类器,无需手动下载存放xml文件,将原分类器加载代码替换为以下内容:
# 加载人脸、人眼级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye_tree_eyeglasses.xml')
# 新增加载校验,提前暴露问题
if face_cascade.empty():
    raise IOError("人脸分类器加载失败")
if eye_cascade.empty():
    raise IOError("人眼分类器加载失败")
  • 如果你要使用自己下载的xml文件,请确保两个xml文件和运行的main.py放在同一目录下,同时确认Pycharm的运行配置中「Working directory」设置为当前项目根目录。

摄像头警告(terminating async callback)

该警告是Windows平台下OpenCV默认使用MSMF后端调用摄像头的已知问题,不影响程序功能,如需消除可修改摄像头初始化代码,指定使用DirectShow后端:

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

修改后可运行的完整代码

import numpy as np
import cv2

# 加载人脸、人眼级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye_tree_eyeglasses.xml')

# 新增加载校验
if face_cascade.empty():
    raise IOError("人脸分类器加载失败")
if eye_cascade.empty():
    raise IOError("人眼分类器加载失败")

# 存储运行状态
first_read = True
# 初始化摄像头,指定DirectShow后端消除Windows平台警告
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

while True:
    ret, img = cap.read()
    if not ret:
        break
    # 转为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 滤波去噪
    gray = cv2.bilateralFilter(gray, 5, 1, 1)
    # 检测人脸
    faces = face_cascade.detectMultiScale(gray, 1.3, 5, minSize=(200, 200))
    if len(faces) > 0:
        for (x, y, w, h) in faces:
            cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
            # 截取人脸区域做人眼检测
            roi_face = gray[y:y+h, x:x+w]
            roi_face_clr = img[y:y+h, x:x+w]
            eyes = eye_cascade.detectMultiScale(roi_face, 1.3, 5, minSize=(50, 50))
            if len(eyes) >= 2:
                if first_read:
                    cv2.putText(img,"Eye detected, press s to begin", (70, 70), cv2.FONT_HERSHEY_PLAIN, 3, (0,255,0), 2)
                else:
                    cv2.putText(img, "Eyes open!", (70, 70), cv2.FONT_HERSHEY_PLAIN, 2, (255,255,255), 2)
            else:
                if first_read:
                    cv2.putText(img, "No eyes detected", (70, 70), cv2.FONT_HERSHEY_PLAIN, 3, (0,0,255), 2)
                else:
                    print("Blink detected -- do you want to continue; press y")
                    cv2.waitKey(3000)
                    first_read = True
    else:
        cv2.putText(img, "No face detected", (100, 100), cv2.FONT_HERSHEY_PLAIN, 3, (0, 255, 0), 2)
    cv2.imshow('img', img)
    a = cv2.waitKey(1)
    if a == ord('q'):
        break
    elif a == ord('s') and first_read:
        first_read = False

cap.release()
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者Iris S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:03:03