compatibility issue with contourArea in openCV 3
Depending on the OpenCV version, cv2.findContours()
has varying return signatures.
In OpenCV 3.4.X, cv2.findContours()
returns 3 items
image, contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
In OpenCV 2.X and 4.1.X, cv2.findContours()
returns 2 items
contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
You can easily obtain the contours regardless of the version like this:
cnts = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
In Opencv 3 API version the cv2.findContours()
returns 3 objects
- image
- contours
- hierarchy
So you need to rewrite your statement as:
image, contours, hierarchy = cv2.findContours(im_bw.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
This problem is caused by the different return value of cv2.findContours in different OpenCV versions.
In OpenCV 4.0.0, this error may looks like 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'
You can find a detailed explanation and solutions here: How to use `cv2.findContours` in different OpenCV versions?
Thanks for @ZdaR; By the way, you can do the following in OpenCV 4.1:
contours, hierarchy = cv2.findContours(im_bw.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)