Проблема совместимости с контуром в openCV 3

Я пытаюсь сделать простой подсчет областей контуров, которые я получаю от 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)

Ответ 1

В версии Opencv 3 API cv2.findContours() возвращает 3 объекты

  • image
  • контуры
  • иерархия

Итак, вам нужно переписать свое выражение как:

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

Ответ 2

Эта проблема вызвана разным возвращаемым значением 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?

Ответ 3

В зависимости от версии 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]