Кортеж контуров должен иметь длину 2 или 3, в противном случае opencv снова изменил свою подпись cv.findcontours. - PullRequest
2 голосов
/ 16 мая 2019

После запуска моего кода я получаю, что кортеж сообщения об ошибке должен иметь длину 2 или 3, в противном случае opencv снова изменил свою подпись возврата. В настоящее время я использую версию 3.4.3.18 opencv. Проблема возникает, когда я беру контуры бегущие imutils ver 0.5.2

Код находит контуры и возвращает контуры, найденные после некоторого обнаружения ребер. Затем алгоритм использует imutils для захвата контуров. Это правильный способ сделать это или есть какой-то современный способ получить контуры вместо использования imutils?

См. Пример ниже:

image, contours, hier = cv.findContours(edged.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)


cnts = imutils.grab_contours(contours)

cnts = sorted(contours, key = cv.contourArea, reverse = True)[:5]

1 Ответ

2 голосов
/ 16 мая 2019

В зависимости от версии OpenCV, findContours() имеет различные подписи возврата.

В OpenCV 3.4.X, findContours() возвращает 3 элемента

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

В OpenCV 4.1.X findContours() возвращает 2 элемента

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

Чтобы вручную получить контуры без использования imutils, вы можете проверить количество элементов в возвращенном кортеже

items = cv.findContours(edged.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
contours = items[0] if len(items) == 2 else items[1]
...