繁体   English   中英

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)

cv2.findContours() 3 API 版本中cv2.findContours()返回 3 个对象

  • 图片
  • 轮廓
  • 等级制度

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

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

根据 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]

这个问题是由于不同OpenCV版本中cv2.findContours的返回值不同造成的。

在 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`?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM