OpenCV TypeError: Expected cv::UMat for argument 'src' - 这是啥?

Posted

技术标签:

【中文标题】OpenCV TypeError: Expected cv::UMat for argument \'src\' - 这是啥?【英文标题】:OpenCV TypeError: Expected cv::UMat for argument 'src' - What is this?OpenCV TypeError: Expected cv::UMat for argument 'src' - 这是什么? 【发布时间】:2019-06-12 11:13:41 【问题描述】:

免责声明:巨大的 openCV 菜鸟

Traceback(最近一次调用最后一次):

文件“lanes2.py”,第 22 行,在

canny = canny(lane_image)

文件“lanes2.py”,第 5 行,canny

gray = cv2.cvtColor(imgUMat, cv2.COLOR_RGB2GRAY)

TypeError: 参数“src”的预期 cv::UMat

“src”到底指的是什么?

【问题讨论】:

没有足够的信息来调试错误。简而言之,src 指的是您传递给函数的输入矩阵/图像。 【参考方案1】:

srccv2.cvtColor 的第一个参数。

你得到的错误是因为它不是正确的形式。 cv2.Umat() 在功能上等同于 np.float32(),所以你的最后一行代码应该是:

gray = cv2.cvtColor(np.float32(imgUMat), cv2.COLOR_RGB2GRAY)

【讨论】:

【参考方案2】:
gray = cv2.cvtColor(cv2.UMat(imgUMat), cv2.COLOR_RGB2GRAY)

UMat 是Transparent API (TAPI) 的一部分,它有助于为 CPU 和 OpenCL 实现编写一段代码。

【讨论】:

这给了我这个错误UMat() missing required argument 'ranges' (pos 2) @AmitSharma:那么imgUMat 可能不是有效的ndarray,可能只是None【参考方案3】:

以下可以从numpy使用:

import numpy as np 
image = np.array(image)

【讨论】:

这对我有用(python3.7)。绘制图像是成功的,并且图像似乎没有以任何方式损坏。但尝试使用 cv2.resize(image, (1280, 720)) 时仍然出现此错误。如上所示,使用 numpy 转换为 ndarray 后问题已解决。 重要问题:ndarray 必须是连续的,所以在某些情况下你需要复制它,否则你会得到主题标题的错误。或者更好的是,按照这个答案的建议使用np.ascontiguousarray(imgUMat):***.com/a/68436015/4094574【参考方案4】:

问题不是你的代码,这很好:

gray = cv2.cvtColor(imgUMat, cv2.COLOR_RGB2GRAY)

问题是 imgUMat 是 None 所以你在加载图片时可能犯了一个错误:

imgUMat = cv2.imread("your_image.jpg")

我怀疑你刚刚输入了错误的图片路径。

【讨论】:

【参考方案5】:

只需在开始时添加:

image = cv2.imread(image)

【讨论】:

【参考方案6】:

canny 是你自己的功能吗?你在里面使用 OpenCV 的Canny 吗?如果是,请检查您是否为 Canny 提供合适的参数 - 第一个 Canny 参数应符合以下条件:

类型:<type 'numpy.ndarray'> dtype:dtype('uint8') 单通道或简单:灰度,即二维数组,即它的shape应该是ints的2-tupletuple正好包含2个整数)

可以分别打印查看

type(variable_name)
variable_name.dtype
variable_name.shape

variable_name 替换为您作为Canny 的第一个参数提供的变量名称。

【讨论】:

【参考方案7】:

这是一个一般错误,当您使用的数据类型之间存在不匹配时,有时会引发此错误。例如,我尝试使用 opencv 调整图像大小,它给出了同样的错误。 Here 是关于它的讨论。

【讨论】:

【参考方案8】:

特定 OpenCV 函数不支持某些 dtype。例如,dtype np.uint32 的输入会创建此错误。尝试将输入转换为支持的 dtype(例如 np.int32 或 np.float32)

【讨论】:

【参考方案9】:

使用np.ascontiguousarray 将您的图像矩阵转换为 ascontiguousarray,如下所示:

gray = cv2.cvtColor(np.ascontiguousarray(imgUMat), cv2.COLOR_RGB2GRAY)

【讨论】:

文档说:“在内存中返回一个连续的数组(C 顺序)”,OpenCV 需要 从技术上讲,这不是转换,而是确保 ndarray 将连续放置在内存中(如果需要,可以复制)【参考方案10】:

这是指您的图像的预期 dtype "image".astype('float32') 应该可以解决您的问题

【讨论】:

【参考方案11】:

当来自imutils 包的videostream 无法识别框架或提供空框架时,有时我会遇到此错误。在这种情况下,解决方案将找出为什么你有这么糟糕的帧或使用来自 opencv2 的标准 VideoCapture(0) 方法

【讨论】:

video capture(0) 无法识别帧,因为相机坏了..不是吗????请解开这个疑问【参考方案12】:

如果使用 ImageGrab

由于bbox不正确,请验证您的图像不是 0x0 区域。

【讨论】:

【参考方案13】:

我通过写入/读取文件来解决问题。我猜想 cv.imread 会把它变成它需要的格式。此代码用于 anki Vector SDK 程序,但您明白了。

tmpImage = robot.camera.latest_image.raw_image.save('temp.png')         
pilImage = cv.imread('temp.png')

【讨论】:

【参考方案14】:

验证应用程序根文件夹是否与您尝试运行的文件相同。

【讨论】:

以上是关于OpenCV TypeError: Expected cv::UMat for argument 'src' - 这是啥?的主要内容,如果未能解决你的问题,请参考以下文章

opencv TypeError:“插值”是此函数的无效关键字参数

OpenCV TypeError: Expected cv::UMat for argument 'src' - 这是啥?

Python OpenCV 立体相机校准阵列错误:TypeError:不支持 imagePoints1 数据类型 = 17

opencv FisherFaceRecognizer 的 train() 函数显示 TypeError: src is not a numpy array, not a scalar

OpenCV ORB 描述符:TypeError:不正确的自我类型(必须是“Feature2D”或其派生词)

vue调用组件,组件回调给data中的数组赋值,报错Invalid prop type check failed for prop value. Expecte