【问题标题】: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 指的是您传递给函数的输入矩阵/图像。

标签: python opencv typeerror 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)stackoverflow.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】:

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2020-10-03
                      • 2021-01-29
                      • 2019-08-03
                      • 2021-12-09
                      • 2021-04-15
                      • 2019-12-13
                      • 2021-05-29
                      相关资源
                      最近更新 更多