在opencv numpy中找到轮廓的边界点

时间:2018-04-19 08:08:13

标签: python numpy opencv contour opencv-contour

enter image description here在开放的cv和numpy这里完成菜鸟。这是图像:这是我的代码:

solutions.Rmd

像素点的长度接近200万,因为它包含轮廓所覆盖的所有点。但我只需要那个轮廓的边界点。我该怎么做?我已尝试过opencv文档中的几种方法,但总是出现元组和排序操作的错误。请...帮助?

我只需要轮廓的边界点:(

1 个答案:

答案 0 :(得分:1)

这是轮廓边界点的意思吗?
(I used your image above to try)

您看到的白线是我在蓝色绘制的轮廓上用白色标记的点。右下角有一个小斑点,因为我认为您的黑色背景很可能不是真的是黑色,所以当我进行阈值处理和填充以获取此背景时,
enter image description here

在同一地点有一个很小的白色斑点。但是,如果您使用这些参数并进行更适当的阈值设置和泛洪,那应该不是问题。 在openCV的drawContours函数中,cnts将包含轮廓列表,每个轮廓将包含点数组。每个点的类型也都是numpy.ndarray。如果要将每个轮廓的所有点都放在一个位置,以便它返回一组边界点(如上图中的白点轮廓所示),则可能要将它们全部添加到列表中。您可以尝试以下方法:

#rgb is brg instead
contoured=cv2.drawContours(black, cnts, -1, (255,0,0), 3)

#list of ALL points of ALL contours
all_pixels=[]

for i in range(0, len(cnts)):
    for j in range(0,len(cnts[i])):
        all_pixels.append(cnts[i][j])

当我尝试

print(len(all_pixels))

它给了我2139分。

如果您想标记点以用于可视化目的(例如像我的白点),请执行以下操作:

#contouredC is a copy of the contoured image above
contouredC[x_val, y_val]=[255,255,255]

如果要减少点数,只需在遍历时使用步进功能将白色点画出即可。像这样的东西:
enter image description here

在python中,for循环很慢,所以我认为有更好的方法用np.where()函数或其他方法代替嵌套的for循环。如果/当我知道时将更新此内容。同样,这需要更好的阈值化和二值化技术。从Python 2.7: Area opening and closing binary image in Python not so accurate中引用的Floodfill技术。

希望有帮助。