OpenCV 3.1 drawContours '(-215)npoints>0'

szqfcxe2  于 2023-05-01  发布在  其他
关注(0)|答案(8)|浏览(208)

我试图创建一个面具从轮廓,但我得到一个C++错误.
使用OS X约塞米蒂,Python 2.7.10,OpenCV 3.1.0.

def create_mask(img, cnt):
    '''Create a mask of the same size as the image
       based on the interior of the contour.'''
    mask = np.zeros((img.shape[0], img.shape[1]), np.uint8)
    print("create_mask, cnt=%s" % cnt)
    cv2.drawContours(mask, [cnt], 0, (0, 255, 0), -1)
    return mask

print("Creating mask from contour %s, on raw shape %s" % (page_contour, raw.shape))
page_mask = create_mask(raw, page_contour)

输出(错误见底部):

Creating mask from contour [[ 1626.   360.]
 [ 1776.  3108.]
 [  126.  3048.]
 [  330.   486.]], on raw shape (3840, 2160, 3)
create_mask, cnt=[[ 1626.   360.]
 [ 1776.  3108.]
 [  126.  3048.]
 [  330.   486.]]
OpenCV Error: Assertion failed (npoints > 0) in drawContours, file /tmp/opencv320160309-92782-1efch74/opencv-3.1.0/modules/imgproc/src/drawing.cpp, line 2380
Traceback (most recent call last):
  File "./books.py", line 209, in <module>
    page_mask = create_mask(raw, page_contour)
  File "./books.py", line 123, in create_mask
    cv2.drawContours(mask, [cnt], 0, (0, 255, 0), -1)
cv2.error: /tmp/opencv320160309-92782-1efch74/opencv-3.1.0/modules/imgproc/src/drawing.cpp:2380: error: (-215) npoints > 0 in function drawContours

文档说它应该得到一个数组的数组,这似乎是我给它的。怎么了?
代码从OpenCV 2移植。x.

yizd12fk

yizd12fk1#

我认为您在cnt周围添加了额外的[],它应该是

cv2.drawContours(mask, cnt, 0, (0, 255, 0), -1)

因为cnt已经是数组的数组,但是[cnt]是数组的数组的数组,这将不起作用

更新为以上代码

你应该先把你的轮廓转换成numpy数组

ctr = numpy.array(cnt).reshape((-1,1,2)).astype(numpy.int32)
cv2.drawContours(mask, [ctr], 0, (0, 255, 0), -1)

在此查看文档
contours是图像中所有轮廓的Python列表。每个单独的轮廓是对象边界点的(x,y)坐标的Numpy数组。

tcbh2hod

tcbh2hod2#

对我来说这很有效。但我不知道为什么。
cv2.drawContours(mask, [cnt.astype(int)], 0, (0, 255, 0), -1)
当你从findContours得到一个圆形浮点数组时,drawContours不会抱怨。但是当我自己构造一个类似的(4,2)浮点数数组时,它会抱怨。

omjgkv6w

omjgkv6w3#

你可能在寻找轮廓时犯了错误。Contour是findContours()函数返回的第二个值,如docs所示

im2, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

因此下面的代码将不起作用

cnt = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

这可能解决你的问题。

qzwqbdag

qzwqbdag4#

如果你用这个,它会工作的。..

ctr = np.array(cnt).reshape((-1,1,2)).astype(np.int32)
cv2.drawContours(mask, [ctr], -1, 255, -1)
2lpgd968

2lpgd9685#

它是一个numpy数组,所以它不会以这种方式工作。请确保将其添加到代码np.array(loop variable).reshape((-1,1,2)).astype(np.int32)中。

hmtdttj4

hmtdttj46#

如果传入drwaContours函数的numpy数组的数据类型不是int64,也会发生此错误。如果对等高线中的点应用变换,从而更改其数据类型,则可能会发生此数据类型错误。要更正此错误,请确保将轮廓数据类型转换为int64。

new_contour = old_contour_wrong_dtype.dtype('int64')
yrefmtwq

yrefmtwq7#

在我的例子中,它是由轮廓的错误形状引起的,用ct.reshape((-1,1,2)).astype(np.int32)重塑轮廓,然后它对我有效。

aor9mmx1

aor9mmx18#

它的层次结构,轮廓如此:
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

相关问题