OpenCv cv2.arcLength(cnt,True)和cv2.contourArea(cnt)错误

时间:2017-12-04 13:27:36

标签: python-3.x opencv image-processing

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

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:

  

python3,opencv版本:'3.3.0'

我该如何解决这些问题?

1 个答案:

答案 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]