首页 > 解决方案 > OpenCV Python Numpy:ValueError:要解压的值太多(预期为 2)

问题描述

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

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.xnumpyopencv

解决方案


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

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

这里0指的是cv2.IMREAD_GRAYSCALEflag。这很重要,因为在这种情况下,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数组返回这就是您遇到上述错误的原因。


推荐阅读