openCV 3 中 contourArea 的兼容性问题

compatibility issue with contourArea in 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 的类型相匹配

谢谢:)

编辑:原来我需要采用 findContours

的第二个参数
 im2, cc, hierarchy = cv2.findContours(im_bw.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

在 Opencv 3 API 版本 cv2.findContours() returns 3 objects

  • 图片
  • 轮廓
  • 层级

因此您需要将语句重写为:

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

此问题是由于OpenCV不同版本cv2.findContours的return值不同造成的

在 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'

您可以在这里找到详细的解释和解决方案:

根据 OpenCV 版本,cv2.findContours() 具有不同的 return 签名。

在 OpenCV 3.4.X, cv2.findContours() returns 3 项

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

在 OpenCV 2.X 和 4.1.X, cv2.findContours() returns 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]

感谢@ZdaR; 顺便说一句,您可以在 OpenCV 4.1 中执行以下操作:

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