代码片段

# 找到最大连通域
        contours, hierarchy = cv2.findContours(erosion, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
        area = []  # find the max area of all the contours and fill it with 0
        for i in range(len(contours)):
            area.append(cv2.contourArea(contours[i]))
        max_idx = np.argmax(area)
        max_area = cv2.contourArea(contours[max_idx])
        for i in range(len(contours)):
            if i != max_idx:
                cv2.fillConvexPoly(erosion, contours[i], 0) # 有坑

实验

如图:
想使用fillConvexPoly进行0填充非最大连通域的部分,发现与预期不符:


使用fillConvexPoly这个函数是有缺陷的,如果最大连通域不是凸的,则会得到错误的填充结果。
cv2.fillConvexPoly()函数,只能用来填充凸多边形。
只需要提供凸多边形的顶点即可。

解决方案

cv2.fillPoly()
cv2.fillPoly()函数可以用来填充任意形状的图型.可以用来绘制多边形,工作中也经常使用非常多个边来近似的画一条曲线。cv2.fillPoly()函数可以一次填充多个图型。
cv2.fillPoly()函数可以用来填充任意形状的图型,可以用来绘制多边形。也可以使用非常多个边来近似的画一条曲线。cv2.fillPoly()函数可以一次填充多个图型。
在刚开始使用cv2.fillPoly()时,会发现没有效果,只有轮廓线被染色了,内部却没有被填充。这是因为忘记了加中括号。
点构成的边界,要加中括号[  ]。见下面例子:
contours是一堆边界,往往是通过二值化操作、cv2.findContours方法找到的结果。这里近取出第1个边界数组来画。

cv2.fillPoly(img,[contours[1]],(255,0,0))  #填充内部
cv2.fillPoly(img,contours[1],(255,0,0)) #只染色边界

解决

# 找到最大连通域
        contours, hierarchy = cv2.findContours(erosion, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
        area = []  # find the max area of all the contours and fill it with 0
        for i in range(len(contours)):
            area.append(cv2.contourArea(contours[i]))
        max_idx = np.argmax(area)
        max_area = cv2.contourArea(contours[max_idx])
        for i in range(len(contours)):
            if i != max_idx:
                cv2.fillPoly(erosion, [contours[i]], 0)

参考

https://blog.csdn.net/xuyangcao123/article/details/81023732
https://blog.csdn.net/lyxleft/article/details/90676451

最后修改日期: 2019年7月16日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。