错误:(-215:断言失败)n点>使用 OpenCV 处理轮廓时 0



当我运行这段代码时:

import cv2
image = cv2.imread('screenshoot10.jpg')
cv2.imshow('input image', image)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edged = cv2.Canny(gray, 30, 200)
cv2.imshow('canny edges', edged)
_, contours = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cv2.imshow('canny edges after contouring', edged)
print(contours)
print('Numbers of contours found=', len(contours))
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
cv2.imshow('contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

我收到此错误:

公开简历(4.1.1( C:\projects\opencv-python\opencv\modules\imgproc\src\drawing.cpp:2509: 错误:(-215:断言失败(n点>函数中的 0 'cv::d rawContours'

我做错了什么?

根据 findContours 的文档,该方法返回(contours、层次结构(,所以我认为代码应该是:

contours, _ = cv2.findContours(edged,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

而不是

_, contours = cv2.findContours(edged,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

根据OpenCV版本,cv2.findContours()有不同的返回签名。在v3.4.X中,返回三个项目。

image, contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

v2.Xv4.1.X中,返回两个项目。

contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

无论版本如何,您都可以轻松获得轮廓,如下所示:

cnts = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
...

由于最后两个值始终相同,因此我们可以使用[-2:]将其进一步压缩为一条线,以从cv2.findContours()返回的元组中提取轮廓

cnts, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]

因为这个问题在寻找Error: (-215:Assertion failed) npoints > 0 while working with contours using OpenCV时出现在顶部,所以我想指出另一个可能的原因,为什么会出现此错误:

在完成minAreaRect后,我正在使用BoxPoints函数来获得围绕轮廓旋转的矩形。在将它传递给 drawContours 之前,我没有对其输出进行np.int0(将返回的数组转换为整数值(。这修复了它:

rect = cv2.minAreaRect(cnt)
box = cv2.cv.BoxPoints(rect) 
box = np.int0(box) # convert to integer values
cv2.drawContours(im,[box],0,(0,0,255),2)

此处提供的所有解决方案要么针对特定版本是固定的,要么不存储从cv2.findContours()返回的所有值。您可以存储从函数的每个元组返回的所有值,而与cv2的版本无关。

无论系统/环境中安装的 OpenCV 版本如何,以下代码片段都将起作用,并且还将所有元组存储在各个变量中。

首先,安装OpenCV的版本(我们不希望整个版本只有3或4的主数字(:

import cv2
version = cv2.__version__[0]

根据版本,将执行以下两个语句中的任何一个,并填充相应的变量:

if version == '4':
contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
elif version == '3':
img, contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

在这两种情况下,从函数返回的等值线都将存储在contours中。

注意:上面的代码片段是假设安装了 OpenCV 版本 3 或 4 编写的。对于旧版本,请参阅文档或更新到最新版本。

如果您使用的是 OpenCV 版本 4,并且想知道版本 3cv2.findContours()返回的第一个变量是什么;它与输入图像相同(在本例中为binary_image(。

最新更新