OpenCV调整待写入图像尺寸时触发!ssize.empty()断言错误
错误原因
触发!ssize.empty() in function 'cv::resize'报错的核心是传入cv2.resize的图像是空值/无效尺寸,结合代码具体有5个问题:
- 循环参数笔误:
face_cropped内遍历人脸检测结果的语句写为for (x,y,w,y) in faces,高度参数位置错写为y,裁剪时用到的变量h未定义,无法生成有效裁剪区域。 - 空值无拦截:当画面未检测到人脸时,
face_cropped无显式返回值,默认返回None,代码直接将该空值传入resize,直接触发断言错误。 - 重复调用检测逻辑:判断非空时调用一次
face_cropped,resize时又调用一次,两次检测无帧同步,既浪费性能,也可能出现第一次检测到人脸、第二次未检测到的时序问题,拿到空值。 - 变量名笔误:保存路径中用了Python内置函数
id,并非自定义的用户编号变量,会生成错误文件名。 - 按键等待参数错误:
cv2.waitKey(0)会永久阻塞等待按键,按一次才读一帧,无法连续采集,不符合数据集采集的逻辑。
修复方案
- 修正人脸检测遍历参数为
(x,y,w,h),给face_cropped增加空判断,未检测到人脸时显式返回None。 - 单次调用人脸裁剪函数,结果存入变量,非空时再执行resize、灰度转换、保存、显示逻辑,空帧直接跳过。
- 修正保存路径的用户ID变量,将
cv2.waitKey参数改为1,实现连续读帧。 - 提前创建data存储目录,避免因目录不存在导致文件写入失败。
- 检查人脸分类器加载路径,确保分类器正常加载,否则检测函数始终返回空结果。
修复后可运行代码
import cv2 import os from tkinter import messagebox # 提前创建数据集存储目录 if not os.path.exists("data"): os.makedirs("data") # 加载OpenCV自带的正面人脸分类器 face_classifier = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml") def face_cropped(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_classifier.detectMultiScale(gray, 1.3, 5) # 未检测到人脸直接返回None if len(faces) == 0: return None for (x, y, w, h) in faces: crop_img = img[y:y+h, x:x+w] return crop_img cap = cv2.VideoCapture(0) img_id = 0 user_id = 1 # 可替换为实际采集的用户编号 while True: ret, my_frame = cap.read() if not ret: break # 仅执行一次人脸裁剪,避免重复检测 crop_result = face_cropped(my_frame) if crop_result is not None: img_id += 1 # 裁剪结果非空时再做后续处理 face = cv2.resize(crop_result, (450, 450)) face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY) save_path = f"data/user.{user_id}.{img_id}.jpg" cv2.imwrite(save_path, face) cv2.putText(face, str(img_id), (50, 50), cv2.FONT_HERSHEY_COMPLEX, 2, (0, 255, 0), 2) cv2.imshow("Cropped Face", face) # 按回车键或采集满100张样本时退出循环 if cv2.waitKey(1) == 13 or img_id == 100: break cap.release() cv2.destroyAllWindows() messagebox.showinfo("Result", "Generating dataset completed!")
注:运行前请确保已安装opencv-python依赖,若使用自定义的人脸分类器,替换分类器加载路径即可。
内容的提问来源于stack exchange,提问作者tahir habib
相关产品推荐
相关产品推荐

