当我尝试运行以下代码时:
img = cv2.imread('index4.jpg',0)
ret,thresh = cv2.threshold(img,127,255,0)
ret,thresh = cv2.threshold(img,127,255,0)
contours,hierarchy, _ = cv2.findContours(thresh, 1, 2)
cnt = contours[0]
perimeter = cv2.arcLength(cnt,True)
我收到以下错误:
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-65-f8db5433a171> in <module>()
----> 1 perimeter = cv2.arcLength(cnt,True)
error: /io/opencv/modules/imgproc/src/shapedescr.cpp:285: error: (-215) count >= 0 && (depth == CV_32F || depth == CV_32S) in function arcLength
然后:
area = cv2.contourArea(cnt)
和Error
:
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-63-c660947e12c8> in <module>()
----> 1 area = cv2.contourArea(cnt)
error: /io/opencv/modules/imgproc/src/shapedescr.cpp:320: error: (-215) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function contourArea
python3,opencv版本:'3.3.0'
我该如何解决这些问题?
答案 0 :(得分:3)
轮廓是findContours()
返回的元组中的第二个元素,而不是第一个。以前在早期版本的OpenCV中,findContours()
只返回两个结果---但现在它返回三个 - 并且附加值成为返回元组的第一个元素。
来自docs for cv2.findContours()
:
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) → image, contours, hierarchy
因此
image, contours, hierarchy = cv2.findContours(thresh, 1, 2)
会解决你的问题。或者如果你只想要轮廓,你不需要使用像_
这样的一次性变量,只需索引返回的元组:
contours = cv2.findContours(thresh, 1, 2)[1]