调用OpenCV resize函数时出现!ssize.empty()断言失败的原因是什么?
resize空值报错根因说明
error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/resize.cpp:3720: error: (-215:Assertion failed) !ssize.empty() in function 'resize'
这个报错和resize函数本身的逻辑无关,触发条件是OpenCV在执行resize前做输入校验时,发现传入的待处理图像是一个空值(None)——也就是cv2.imread没能成功读取到目标文件,返回了默认的None值,直接传入resize函数就会触发这个空值断言失败。
你的代码存在的具体问题
对照给出的代码,有两个直接导致读取失败的硬伤:
- 字符串硬拼路径时,目录和文件名之间缺少路径分隔符:你写的路径拼接逻辑是
目录路径 + 图片ID + 后缀,拼出来的完整路径是/content/drive/MyDrive/DATASET/HAM10000_images_part_1图片ID.jpg,系统会把HAM10000_images_part_1图片ID.jpg识别为带后缀的文件名,而不是“part1文件夹下以图片ID命名的jpg文件”,自然找不到目标文件 - 缺少imread返回值校验:OpenCV的imread遇到文件不存在、路径无权限、文件损坏的情况,不会主动抛出可读的错误提示,只会静默返回None,你没有加判断就直接把返回值传给resize,把本该在文件读取环节暴露的问题,延后到了resize环节触发,才会造成“resize涉及空值”的错觉
修正后的可运行代码
import os import cv2 import numpy as np import matplotlib.pyplot as plt # 读取数据集对应的图像ID列表 fname_images = np.array(df_skin['image_id']) # 定义两个HAM10000的图像存储路径(该数据集本身分两个压缩包拆分存储) img_dirs = [ '/content/drive/MyDrive/DATASET/HAM10000_images_part_1', '/content/drive/MyDrive/DATASET/HAM10000_images_part_2' ] # 自动匹配对应图片所在的路径 file_to_read = None for img_dir in img_dirs: candidate_path = os.path.join(img_dir, f"{fname_images[0]}.jpg") if os.path.exists(candidate_path): file_to_read = candidate_path break # 提前做读取校验,避免下游函数触发无意义的空值报错 if file_to_read is None: raise FileNotFoundError("在指定的两个存储路径下,未找到对应ID的图像文件") img = cv2.imread(file_to_read) if img is None: raise ValueError(f"图像文件损坏或格式不支持,读取失败:{file_to_read}") # 执行缩放操作 img2 = cv2.resize(img, (100, 100)) # 绘制对比图 plt.figure(figsize=(10,5)) plt.subplot(1,2,1) plt.imshow(img[:,:,::-1]) plt.title('Original image') plt.subplot(1,2,2) plt.imshow(img2[:,:,::-1]) plt.title('Resized image for DenseNet') plt.show()
长期避坑提示
- 永远不要用字符串直接拼接文件路径,统一用
os.path.join处理路径,自动适配不同系统的分隔符规则,从根源上避免漏写斜杠的低级错误 - OpenCV的imread不支持读取带中文的路径,涉及中文路径时需要换用
np.fromfile搭配cv2.imdecode的方式读取 - 所有涉及文件读取的环节,都要在拿到返回值后立刻判断是否为None,不要等下游处理函数触发空值报错,再回头排查上游的读文件问题
内容的提问来源于stack exchange,提问作者Ahmed Tamam
相关产品推荐
相关产品推荐

