OpenCV:按区域排序轮廓(Python)

Dav*_*ked 2 python opencv computer-vision

OpenCV库提供了为二进制(阈值)图像返回一组轮廓的函数。SilhouetteArea()可以用于查找关联的区域。

默认情况下,findContours()输出的轮廓列表是否按面积排序?如果不是,是否有人知道按区域排序轮廓列表的cv2函数?

请以Python而非C语言提供回应。

Kan*_*hew 13

image, cnts, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = sorted(cnts, key=cv2.contourArea)
Run Code Online (Sandbox Code Playgroud)

cnt为您提供一个按区域递增顺序排列的轮廓的有序列表。

您可以通过索引找到轮廓面积:

area = cv2.contourArea(cnt[index])
Run Code Online (Sandbox Code Playgroud)

索引可以是1,2,3.....,len(cnts)

要访问最大面积轮廓:

cnt[reverse_index]
Run Code Online (Sandbox Code Playgroud)

将reverse_index设置为-1

对于第二大的,将reverse_index设置为-2,依此类推。

上述也可以通过以下方式实现:

cnt = sorted(cnts, key=cv2.contourArea, reverse=True)
Run Code Online (Sandbox Code Playgroud)

所以 cnt[1] 给出最大的轮廓 cnt[2] 第二大,依此类推。

  • 自从我们从 0 开始索引以来,难道不应该将 cnt[0] 表示最大,将 cnt[1] 表示第二大吗?如果不是,索引 0 处是什么? (2认同)

sha*_*r_m 5

使用sorted并按区域键排序:

cnts = cv2.findContours(boolImage.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]  
cntsSorted = sorted(cnts, key=lambda x: cv2.contourArea(x))
Run Code Online (Sandbox Code Playgroud)