Контуры OpenCV - требуется более двух значений для распаковки

Я пытаюсь реализовать контуры, используя следующий код.

im = cv2.imread('C:\Users\Prashant\Desktop\T.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
img = cv2.drawContour(im, contours, -1, (0,255,0), 3)
cv2.imshow('Image1',img)

но я постоянно получаю следующую ошибку.

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 540, in runfile
    execfile(filename, namespace)
  File "C:/Users/Prashant/.spyder2/.temp.py", line 17, in <module>
    image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
ValueError: need more than 2 values to unpack

нужна ли функции findContours больше аргументов? Что я мог сделать, чтобы исправить это.

Ответ 1

В OpenCV 2 findContours возвращает только два значения contours и hierarchy. Ошибка возникает, когда python пытается присвоить эти два значения трем именам, указанным слева в этом утверждении:

image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

Ответ 2

findContours возвращает только три значения изображения, контуров и иерархии в opencv3

image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

Ответ 3

Теперь он возвращает три значения:

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

Обратное изображение, контуры, иерархия

Ответ 4

  • findContours возвращает только два значения. так что используйте только,

Так что используйте

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

Ответ 5

Это должно помочь:

image, contours, hierarchy = cv2.findContours(thresh.copy(),
                                              cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

Ответ 6

По состоянию на 2019 год у нас есть три версии OpenCV (OpenCV2, OpenCV3 и OpenCV4).

OpenCV4 и OpenCV2 имеют одинаковое поведение (возвращая два значения из cv2.findContours). Тогда как OpenCV3 возвращает три значения.

if cv2.getVersionMajor() in [2, 4]:
    # OpenCV 2, OpenCV 4 case
    contour, hier = cv2.findContours(
                    thresh.copy(), cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)
else:
    # OpenCV 3 case
    image, contour, hier = cv2.findContours(
                    thresh.copy(), cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE)

Ответ 7

Версия Python 2.7.14 (v2.7.14: 84471935ed, 16 сентября 2017, 20:25:58) [MSC v.1500 64 бит (AMD64)]

Версия NumPy: 1.16.1

версия argparse: 1.1

Версия CV2: 4.0.0

Traceback (most recent call last):

  File "omr.py", line 254, in <module>

    main()

  File "omr.py", line 237, in main

    answers, im = get_answers(args.input)

  File "omr.py", line 188, in get_answers

    contours = get_contours(im)

  File "omr.py", line 26, in get_contours

    im2, contours, hierarchy =cv2.findContours(image_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

ValueError: need more than 2 values to unpack

Это решается удалением 'im2,' из строки 26.. как и в OpenCv версии 3.0 или выше, функция 'findContours' возвращает только 2 значения.. поэтому оператор должен быть

contours, hierarchy =cv2.findContours(image_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

а также обновите версию OpenCv

Ответ 8

В зависимости от версии OpenCV, cv2.findContours() имеет различные подписи возврата. В OpenCV 3.4.X cv2.findContours() возвращает 3 элемента. В OpenCV 2.X и 4.1.X cv2.findContours() возвращает 2 элемента

Вы можете легко получить контуры независимо от версии, подобной этой:

cnts = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]