【问题标题】:Want to find contours -> ValueError: not enough values to unpack (expected 3, got 2), this appearsWant to find contours -> ValueError: not enough values to unpack (expected 3, got 2),出现这个
【发布时间】:2019-06-07 10:40:21
【问题描述】:

我的简单 Python 代码是这样的

import cv2

img=cv2.imread('Materials/shapes.png')

blur=cv2.GaussianBlur(img,(3,3),0)
gray=cv2.cvtColor(blur,cv2.COLOR_BGR2GRAY)
returns,thresh=cv2.threshold(gray,80,255,cv2.THRESH_BINARY)

ret,contours,hierachy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:

    area=cv2.contourArea(cnt) #contour area
    
    if (area>1220):
        cv2.drawContours(img,[cnt],-1,(0,255,0),2)
        cv2.imshow('RGB',img)
        cv2.waitKey(1000)
        print(len(cnt))

import numpy as np

contours=np.array(contours)

print(contours)

这很好用。但最近我什至没有做出任何改变。这是扔给我的

ret,contours,hierachy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

ValueError: 没有足够的值来解包(预期 3,得到 2)

【问题讨论】:

标签: python python-3.x opencv-contour


【解决方案1】:

函数cv2.findContours() 已更改为仅返回轮廓和层次结构,而不是返回

你应该把它改成:

contours,hierachy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

【讨论】:

  • 谢谢,但在哪个版本中引入了此更改?
  • 所以,他们又破坏了兼容性,但 python 模块仍然是 cv2。
  • @Osman-pasha 在这种情况下谁是“他们”? cv2 中的 2 也只是一个命名空间,与实际版本无关。他们和 OpenCV 的开发人员一样,实际上遵循语义版本控制,并且在将主要版本从 3.x 更改为 4.x 时引入了这种更改,这很好。您在“再次破坏兼容性”中设置的语气表明您可能不喜欢它的正确处理方式。所以为了回答你的问题,它是在 4.0 版本中引入的,是的,它仍然使用 cv2 命名空间。
  • @swalog 是的,你明白我的意思。你看,网上很多例子都没有提到使用的是什么OpenCV版本,只是告诉你pip install opencv(或者什么都不说)。突然之间,这些示例不起作用,因为 API 发生了变化。如果他们(是的,OpenCV 开发人员)将 cv2 用于 OpenCV 2,将 cv3 用于 OpenCV 3 等,就不会有这种混淆,因为从代码中可以清楚地看到要使用的主要版本。我确信他们有理由保留 cv2,它与 C++ API 的关系比主要版本更重要,但回想起来,这似乎是一个糟糕的决定。
【解决方案2】:

this python 代码示例中有很好的解释,使代码版本证明的最佳方法是使用以下语法:

# check OpenCV version
major = cv2.__version__.split('.')[0]
if major == '3':
    ret, contours, hierarchy = cv2.findContours(im.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
else:
    contours, hierarchy = cv2.findContours(im.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

这为您提供了可以在 OpenCV 的最新版本或旧版本上运行的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2020-10-26
    • 2017-12-23
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多