当我尝试运行以下代码时:
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]