python-3.x - OpenCV Python Numpy : ValueError: too many values to unpack (expected 2)

标签 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

最佳答案

您在上面提到的答案是使用

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

这里,0 指的是 cv2.IMREAD_GRAYSCALE 标志。这很重要,因为在这种情况下,image 将只有 1 channel 。如果您以这种方式加载您的图像并运行您的代码,它将正常工作。我已经测试过了。在这种情况下,(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 数组的元组,因为 mask 是一个3d array here 这就是您遇到上述错误的原因。

关于python-3.x - OpenCV Python Numpy : ValueError: too many values to unpack (expected 2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57098711/

相关文章:

python-3.x - Opencv - ModuleNotFoundError : No module named 'cv2' - MacOS

python - 在子类中覆盖时使用父属性 setter

Python - numpy.delete 不起作用

c++ - OpenCV 立体视觉 3D 坐标到 2D 相机平面投影不同于三角测量 2D 点到 3D

python-3.x - 计算幂的最有效算法是什么?

python - 无法使用相同的 AES 对象解密给定的密文两次

python - Scipy 从坐标列表快速初始化稀疏矩阵

python - 使用 PYTHON 将 3 维 DataFrame 转换为 3 维数组时出现问题

python - OpenCV:从 VideoCapture 读取帧将视频推进到奇怪的错误位置

python - Kinect + Python - 阴影的填充深度