当我尝试运行以下代码时:

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

N.B:



我该如何解决这些问题?

最佳答案

轮廓是findContours()返回的元组中的第二个元素,而不是第一个。以前,在旧版本的OpenCV中,findContours()仅返回两个结果-但现在返回了三个-并且附加值成为返回的元组的第一个元素。

docs for cv2.findContours() :



从而

image, contours, hierarchy = cv2.findContours(thresh, 1, 2)

会帮你解决的。或者,如果只希望轮廓,则不需要使用_这样的一次性变量,只需索引返回的元组即可:
contours = cv2.findContours(thresh, 1, 2)[1]

09-25 18:44