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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:03:23