[英]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.