我正在尝试从轮廓创建一个蒙版,但是我遇到了C ++错误。
使用OS X Yosemite,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
docs说它应该得到一个数组数组,这似乎就是我给它的。那有什么不对?
代码从OpenCV 2.x移植。
答案 0 :(得分:15)
我认为您在[]
附近添加额外的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)
检查文档here
contours是图像中所有轮廓的Python列表。每 单个轮廓是边界的(x,y)坐标的Numpy数组 对象的点。
答案 1 :(得分:7)
对我来说这很有用。但我不确定为什么。
cv2.drawContours(mask, [cnt.astype(int)], 0, (0, 255, 0), -1)
当你从findContours获得一个圆形浮点数组时,drawContours不会抱怨。但是当我自己构建一个类似的(4,2)浮动数组时,它会抱怨。
答案 2 :(得分:1)
在寻找轮廓时,您可能犯了错误。轮廓是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)
这可能会解决您的问题。
答案 3 :(得分:-1)
如果您仅使用它,它将起作用...
ctr = np.array(cnt).reshape((-1,1,2)).astype(np.int32)
cv2.drawContours(mask, [ctr], -1, 255, -1)
答案 4 :(得分:-1)
其层次结构,轮廓如下:
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)