【问题标题】:OpenCV Python Numpy : ValueError: too many values to unpack (expected 2)OpenCV Python Numpy:ValueError:要解包的值太多(预期为 2)
【发布时间】:2019-11-27 15:17:14
【问题描述】:

我正在尝试将图像裁剪到轮廓的边界。我从这个answer 中找到了一个代码

mask = np.zeros_like(image)
cv2.drawContours(mask, [c], -1, 255, -1)
out = np.zeros_like(image)
out[mask == 255] = image[mask == 255]

(y, x) = np.where(mask == 255)
(topy, topx) = (np.min(y), np.min(x))
(bottomy, bottomx) = (np.max(y), np.max(x))
out = out[topy: bottomy + 1, topx:bottomx + 1]

crop_img = image[topy: bottomy + 1, topx:bottomx + 1]
cv2.imshow("croppedd", crop_img)

c 是一个轮廓。

我收到如下错误:

Traceback (most recent call last):
  File "detect_shapes.py", line 66, in <module>
    (y, x) = np.where(mask == 255)
ValueError: too many values to unpack (expected 2)

如何解决我的问题?

  • Python 3.7 版
  • OpenCV 版本 3.4.4

我认为这与我的形象无关,但这里是我的形象;

【问题讨论】:

    标签: python-3.x numpy opencv


    【解决方案1】:

    您上面提到的答案是使用grayscale模式加载图像

    image = cv2.imread('...', 0)
    

    这里,0 指的是cv2.IMREAD_GRAYSCALE 标志。这很重要,因为在这种情况下,image 将只有1 频道。如果您以这种方式加载图像并运行代码,它将正常工作。我已经测试过了。在这种情况下,(y, x) = np.where(mask == 255) 不会给出任何错误,因为np.where(mask == 255) 的输出是两个 numpy 数组的元组,因为mask 是一个2d 数组(使用mask.shape 检查它)。

    但是,如果您将图像加载为image = cv2.imread('...') 而没有执行类似image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 的操作将其转换为灰度,那么在这种情况下,np.where(mask == 255) 返回一个由三个 numpy 数组组成的元组,因为mask3d array here 这就是您遇到上述错误的原因。

    【讨论】:

      【解决方案2】:

      看看

      np.where(mask == 255)
      

      没有 x,y 解包。我猜这是一个 3 元素元组。 where 为输入数组的每个维度生成一个数组。如果 mask 是 3d (x,y,channel),则 where 是 (3,) 元组。

      【讨论】:

      • np.where(mask == 255) 肯定会返回一个大小大于或小于 2 的元组。
      猜你喜欢
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2022-01-20
      • 2017-08-29
      • 2020-05-11
      • 2019-07-11
      • 1970-01-01
      相关资源
      最近更新 更多