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

使用cv2.resize循环调整图片大小时报cv::UMat参数错误如何解决

问题根因

Expected cv::UMat for argument 'src' 报错的核心原因是传入cv2.resize的第一个参数不是OpenCV支持的图像矩阵对象,最常见的触发场景如下:

  • 批量读取图片时部分文件读取失败:cv2.imread读取路径不存在、路径含特殊字符(如中文)、文件损坏的图片时会直接返回None,而非合法的图像矩阵,传入resize方法就会触发报错。单张测试时选用的是正常可读取的图片,因此不会触发问题,批量遍历到异常文件时才会报错。
  • 循环内变量被意外覆盖:循环逻辑中如果把存储图像矩阵的变量名重复赋值为其他类型的值(如文件路径、识别结果字符串),后续传入resize的参数就会变成非图像类型。
  • 图像预处理中间步骤返回异常:如果resize前还有裁剪、二值化等预处理操作,异常场景下这些操作可能返回None,传入resize时也会触发报错。
修复方案
  1. 新增图片读取合法性校验
    每次调用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逻辑
  1. 兼容含中文/特殊字符的路径
    如果图片路径含中文,cv2.imread默认无法正常读取,可替换为cv2.imdecode方案读取:
import numpy as np
# 替换cv2.imread的写法
img = cv2.imdecode(np.fromfile(img_path, dtype=np.uint8), cv2.IMREAD_COLOR)
  1. 检查循环内变量命名
    不要复用同一个变量名存储不同类型的值,避免图像矩阵变量被意外覆盖。
排查技巧

如果修改后仍然报错,可以在调用cv2.resize前打印传入参数的类型和对应文件路径,快速定位触发异常的文件:

print(type(img), img_path)

内容的提问来源于stack exchange,提问作者newbiecoder6618

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:15:08