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】:
src
是cv2.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
应该是int
s的2-tuple
(tuple
正好包含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