首页 > 解决方案 > 从轮廓列表中删除 opencv 轮廓

问题描述

使用opencv,我正在检测轮廓并选择其中一些:

CNTS = []
_, contours, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
    if some_condition(c):
        CNTS.append(c)

然后我循环遍历轮廓列表的 2 个子集 {c1, c2},并删除其中一些:

TMP = CNTS[:]  # copy it, to avoid deleting element from a list while looping on it!
for c1, c2 in itertools.combinations(TMP, 2):
    if dist(c1, c2) < 100  # custom function to evaluate distance between 2 contours
        if c1 in CNTS:  # it might have been already removed
            CNTS.remove(c1)

问题来了CNTS.remove(c1)

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

如何从轮廓列表中正确删除opencv轮廓?

注意:事实上,它大部分时间都有效,但有时,经过几次迭代后,我会遇到这个错误。也许是因为轮廓是点列表,然后测试“点列表”是否是另一个列表的成员是模棱两可的?

更一般地说,在 Python 中,在测试点列表(= 2 个元素的列表!)本身是否是另一个列表的成员时是否存在一些模棱两可的情况?

标签: pythonlistopencvitertoolsopencv-contour

解决方案


你已经删除了它。出现错误是因为您尝试将其删除两次。

尝试这个:

popup = []
for i in range(len(CNTS)):
    for j in range(i+1, len(CNTS)):
        if dist(CNTS[i], CNTS[j]) < 100:
            popup.append(i)
            break
for i in popup[::-1]:
    CNTS.pop(i)

推荐阅读