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.
相关产品推荐
相关产品推荐

