使用cv2.resize循环调整图片大小时报cv::UMat参数错误如何解决
问题根因
Expected cv::UMat for argument 'src' 报错的核心原因是传入cv2.resize的第一个参数不是OpenCV支持的图像矩阵对象,最常见的触发场景如下:
- 批量读取图片时部分文件读取失败:
cv2.imread读取路径不存在、路径含特殊字符(如中文)、文件损坏的图片时会直接返回None,而非合法的图像矩阵,传入resize方法就会触发报错。单张测试时选用的是正常可读取的图片,因此不会触发问题,批量遍历到异常文件时才会报错。 - 循环内变量被意外覆盖:循环逻辑中如果把存储图像矩阵的变量名重复赋值为其他类型的值(如文件路径、识别结果字符串),后续传入
resize的参数就会变成非图像类型。 - 图像预处理中间步骤返回异常:如果
resize前还有裁剪、二值化等预处理操作,异常场景下这些操作可能返回None,传入resize时也会触发报错。
修复方案
- 新增图片读取合法性校验
每次调用cv2.imread后先判断返回值是否为None,跳过无效文件同时打印日志定位问题,示例代码如下:
import os import cv2 img_dir = "你的图片存放目录" for file_name in os.listdir(img_dir): img_path = os.path.join(img_dir, file_name) img = cv2.imread(img_path) # 新增校验逻辑 if img is None: print(f"跳过无效文件:{img_path}") continue # 校验通过后再做缩放 resized_img = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC) # 后续OCR识别、写入Excel逻辑
- 兼容含中文/特殊字符的路径
如果图片路径含中文,cv2.imread默认无法正常读取,可替换为cv2.imdecode方案读取:
import numpy as np # 替换cv2.imread的写法 img = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), cv2.IMREAD_COLOR)
- 检查循环内变量命名
不要复用同一个变量名存储不同类型的值,避免图像矩阵变量被意外覆盖。
排查技巧
如果修改后仍然报错,可以在调用cv2.resize前打印传入参数的类型和对应文件路径,快速定位触发异常的文件:
print(type(img), img_path)
内容的提问来源于stack exchange,提问作者newbiecoder6618
相关产品推荐
相关产品推荐

