处理图像时遭遇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
相关产品推荐
相关产品推荐

