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

处理图像时遭遇TypeError: Expected Ptr<cv::UMat> for argument 'src'错误的解决求助(附cv2.resize相关报错代码)

解决OpenCV报错:TypeError: Expected Ptrcv::UMat for argument 'src'

我之前做摄像头图像预处理时也踩过这个坑,这个错误的核心原因其实很明确,咱们一步步拆解:

错误原因分析

这个报错本质是你传给OpenCV函数(这里是cv2.resize())的src参数不是有效的图像数据。具体到你的代码里,问题出在摄像头帧读取失败:
当cap.read()无法获取到有效帧时,success会返回False,对应的img_original会是None。这时候你用np.asarray(img_original)得到的是一个无效数组(甚至是空数组),OpenCV的函数根本无法处理这种数据,所以直接抛出类型错误,提示需要有效的cv::UMat类型输入。

可行的解决方法

针对这个问题,有几个关键的修复步骤:

1. 强制检查帧读取状态

在处理每帧图像前,一定要先判断success是否为True,如果读取失败就跳过当前帧或者直接退出循环,避免无效数据流入后续处理流程。修改后的完整代码如下:

import cv2
import numpy as np

def pre_processing(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img = cv2.equalizeHist(img)
    img = img / 255
    return img

# 先确认摄像头能正常初始化
cap = cv2.VideoCapture(0)
if not cap.isOpened():
    print("无法初始化摄像头,请检查设备连接或权限")
    exit()

while True:
    success, img_original = cap.read()
    # 核心判断:如果读取失败,直接跳过或退出
    if not success:
        print("读取摄像头帧失败,即将退出")
        break
    
    img = np.asarray(img_original)
    img = cv2.resize(img, (32, 32))
    img = pre_processing(img)
    cv2.imshow("Processsed Image", img)
    img = img.reshape(1, 32, 32, 1)
    
    # 增加退出按键,避免无限循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 最后别忘了释放摄像头和窗口资源
cap.release()
cv2.destroyAllWindows()

2. 排查摄像头本身的问题

如果还是出现读取失败的情况,那就要检查硬件或环境了:

  • 外接摄像头:确认USB连接是否稳固,有没有被其他程序占用(比如视频会议软件)
  • 内置摄像头:检查系统权限是否允许当前程序访问摄像头
  • 可以单独运行摄像头初始化代码,确认cap.isOpened()返回True

3. 额外的图像格式校验(可选)

如果摄像头读取正常,但还是偶尔报错,可以在处理前加一个简单的格式校验,确保图像数组是有效的:

if img is None or img.size == 0:
    continue

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:14:09