OpenCV库提供了一个函数,用于返回二进制(阈值化)图像的轮廓集。 contourArea() 可以应用于查找相关区域。
findContours()输出的轮廓列表是否默认按面积排序?如果不是,有没有人知道一种按面积对轮廓列表进行排序的cv2函数?
请使用Python而不是C来提供答案。
findContours()输出的轮廓列表是否默认按面积排序?如果不是,有没有人知道一种按面积对轮廓列表进行排序的cv2函数?
请使用Python而不是C来提供答案。
使用 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))
image, cnts, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = sorted(cnts, key=cv2.contourArea)
cnt按面积递增的顺序给出轮廓的有序列表。
可以通过索引找到轮廓面积:
area = cv2.contourArea(cnt[index])
索引可以是1、2、3......直到cnts的长度
访问最大面积轮廓:
cnt[reverse_index]
将reverse_index设为-1即可找到最大值。
要找到第二大的值,将reverse_index设为-2,以此类推。
以上也可以通过以下方式实现:
cnt = sorted(cnts, key=cv2.contourArea, reverse=True)
所以 cnt[1] 给出最大的轮廓,cnt[2] 给出第二大的轮廓,以此类推。
greater
函数来比较面积。 - Miki