OpenCV Python Numpy:ValueError:太多值无法解包(预期2)

时间:2019-07-18 16:09:35

标签: python-3.x numpy opencv

我正在尝试将图像裁剪到轮廓的边界。我从此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

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

enter image description here

2 个答案:

答案 0 :(得分:2)

看看

np.where(mask == 255)

,无需打开x,y的包装。我猜这是一个3元素元组。 where为输入数组的每个维生成一个数组。如果mask是3d(x,y,channel),则where是一个(3,)元组。

答案 1 :(得分:2)

您上面提到的答案是使用

grayscale模式加载图像
image = cv2.imread('...', 0)

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

但是,如果您以mask.shape的形式加载图像,而没有执行类似image = cv2.imread('...')的操作来将其转换为灰度,那么在这种情况下,image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)返回一个由三个numpy数组组成的元组因为np.where(mask == 255)是这里的mask数组,这就是导致出现错误的原因。