【问题标题】:ValueError while using cv2.findContours() in python. -> not enough values to unpack (expected 3, got 2)在 python 中使用 cv2.findContours() 时出现 ValueError。 -> 没有足够的值来解包(预期 3,得到 2)
【发布时间】:2019-06-13 23:55:36
【问题描述】:

得到一个错误:

Traceback (most recent call last):
    File "motion_detector.py", line 21, in <module>
        (_, cnts, _) = cv2.findContours(thresh_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 
ValueError: not enough values to unpack (expected 3, got 2)

在检测图像中的轮廓时遇到问题。一直在从教程中仔细检查,并从堆栈溢出中查看以了解我错过了什么,但找不到解决方案。使用 Python 3.6.4 和 OpenCV 4.0.0。感谢您的帮助!

代码在这里:

import cv2, time

first_frame = None

video = cv2.VideoCapture(0)

while True:
    check, frame = video.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray,(21,21),0) 

    if first_frame is None:
        first_frame = gray 

    delta_frame = cv2.absdiff(first_frame, gray)
    thresh_frame = cv2.threshold(delta_frame, 30, 255, cv2.THRESH_BINARY)[1]
    thresh_frame = cv2.dilate(thresh_frame, None, iterations = 2) 

    (_, cnts, _) = cv2.findContours(thresh_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for contour in cnts:
        if cv2.contourArea(contour) < 1000: 
            continue
        (x, y, w, h) = cv2.boundingRect(contour)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)

    cv2.imshow("Gray Frame", gray)
    cv2.imshow("Delta Frame", delta_frame)
    cv2.imshow("Threshold Frame", thresh_frame)
    cv2.imshow("Color Frame", frame)

    key = cv2.waitKey(1)
    print(gray)
    print(delta_frame)

    if key == ord('q'):
        break

video.release()
cv2.destroyAllWindows

【问题讨论】:

    标签: python python-3.x opencv


    【解决方案1】:

    在 Python 版本 2 中,findContours() 用于返回 3 个值,因此我们将其保存在 (_,cnts,_) 中,但在 Python 3 中,它返回 2 个值,即计数和层次结构。所以我们需要把它保存在(cnts,_)。 所以对于 python 2 的人来说,代码如下:

    (_,cnts,_) = cv2.findContours(thresh_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    

    对于 Python 3 的人来说,代码如下:

    (cnts,_) = cv2.findContours(thresh_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    

    它只是关于版本的家伙,不用担心,只要这样改变它,我相信你会得到想要的输出。

    【讨论】:

      【解决方案2】:

      我也遇到了同样的问题,如果您使用的是旧教程 cv2.findContours() 函数返回 3 个值,但如果您使用更高版本,它返回 2 个值,因此您可以删除第一个变量分配并像这样使用

      cnts, _ = cv2.findContours(thresh_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
      

      【讨论】:

        【解决方案3】:

        如果您使用的是 cv 4.0,那么 findContours 将返回两个值。请参阅示例herefindContours 的文档。函数签名如下所示:

        contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

        【讨论】:

        • (_, cnts, _) 更改为contours, hierarchy 有帮助。谢谢。
        【解决方案4】:

        正如指出的问题在于该行:

        (_, cnts, _) = cv2.findContours(thresh_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        

        根据documentation cv2.findCountours 返回两件事:contours, hierarchy,因此当您尝试将其解压缩到 (_, cnts, _) 时出现 3 个元素错误。请尝试用

        替换提到的行
        cnts = cv2.findContours(thresh_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
        

        并检查这是否能解决您的问题。

        【讨论】:

          猜你喜欢
          • 2020-07-30
          • 2017-07-04
          • 2020-07-17
          • 2019-09-24
          • 1970-01-01
          • 2017-09-14
          • 1970-01-01
          • 2019-01-05
          • 2021-10-07
          相关资源
          最近更新 更多