Ответ 1
В версии Opencv 3 API cv2.findContours()
возвращает 3 объекты
- image
- контуры
- иерархия
Итак, вам нужно переписать свое выражение как:
image, contours, hierarchy = cv2.findContours(im_bw.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
Я пытаюсь сделать простой подсчет областей контуров, которые я получаю от findContours. Моя версия openCv - 3.1.0
Мой код:
cc = cv2.findContours(im_bw.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.contourArea(cc[0])
error: 'C:\\builds\\master_PackSlaveAddon-win32-vc12-static\\opencv\\modules\\imgproc\\src\\shapedescr.cp...: error: (-215) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function cv::contourArea\n'
Кат, похоже, решает это, у меня есть чувство, что он просто приписывает то, что я ожидаю, что результат findContours будет соответствовать типу contourArea
Спасибо:)
EDIT: оказывается, мне нужно взять второй аргумент findContours
im2, cc, hierarchy = cv2.findContours(im_bw.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
В версии Opencv 3 API cv2.findContours()
возвращает 3 объекты
Итак, вам нужно переписать свое выражение как:
image, contours, hierarchy = cv2.findContours(im_bw.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
Эта проблема вызвана разным возвращаемым значением cv2.findContours в разных версиях OpenCV.
В OpenCV 4.0.0 эта ошибка может выглядеть как cv2.error: OpenCV(4.0.0) C:\projects\opencv-python\opencv\modules\imgproc\src\convhull.cpp:137: error: (-215:Assertion failed) total >= 0 && (depth == CV_32F || depth == CV_32S) in function 'cv::convexHull'
Вы можете найти подробное объяснение и решения здесь: Как использовать 'cv2.findContours' в разных версиях OpenCV?
В зависимости от версии OpenCV у cv2.findContours()
могут быть разные подписи возврата.
В OpenCV 3.4.X cv2.findContours()
возвращает 3 элемента
image, contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
В OpenCV 2.X и 4.1.X cv2.findContours()
возвращает 2 элемента
contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
Вы можете легко получить контуры независимо от версии, подобной этой:
cnts = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]