具有多个元素的数组的真值是不明确的。使用a.any()或a.all()从索引中删除列表时

时间:2016-03-30 12:28:59

标签: python opencv

我正在尝试采用最大的n轮廓并删除其他轮廓。 但是我在某些框架中得到了这个异常而在其他框架中没有得到它! 尝试从列表中删除轮廓时发生异常

Traceback (most recent call last):
File "/Users/TheMaestro/Desktop/Max Planck/FishTracking/FishTracker/general_tests.py", line 93, in <module>
contours_chest = ImageProcessor.get_bigest_n_contours(contours_chest, 3)
File "/Users/TheMaestro/Desktop/Max Planck/Fish Tracking/FishTracker/Controllers/ImageProcessor.py", line 319, in get_bigest_n_contours
contours.remove(contours[i])
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

这是我的代码:

电话:

contours, hierarchy = cv2.findContours(img_dilated_chest, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = get_biggest_n_contours(contours, 3)

功能:

def get_biggest_n_contours(contours, n):
    contours = sorted(contours, key=get_area, reverse=True)

    contours_count = len(contours)

    if contours_count > n:
        for i in range(n,contours_count):
            contours.remove(contours[i])
            i -= 1

    return contours

Data information 我检查了以前的答案,但我不知道在哪里使用a.any或a.all,我不知道为什么我应该在我的情况下使用它们! 我正在使用索引删除所以我没有看到导致歧义的比较!

谢谢

2 个答案:

答案 0 :(得分:2)

我不完全确定contours的形状,但我怀疑在你调用sorted后你创建了一个numpy数组的python列表。

在这一行contours.remove(contours[i])中,您尝试从numpy数组列表中删除一个元素。 list.remove方法对list中的所有元素进行线性搜索,将它们与要删除的元素进行比较。所以你最终在remove方法中将numpy数组与numpy数组进行比较,并在该比较的布尔值上进行分支,这是不明确的。

您可以remove该索引处的元素,而不是使用pop(实际上只有在您不知道要删除的元素的索引时才使用它)。

但在你的情况下似乎有更好的选择。如果我正确观察到您希望在n中找到contours个最大条目。当数据被排序时(你做了),这在python中是一个简单的任务。因此,您可以在使用以下方法对数组进行排序后对其进行切片:

def get_biggest_n_contours(contours, n):
    contours = sorted(contours, key=get_area, reverse=True)

    return contours[:n]

切片将为您完成所有工作 1.如果少于n个元素,则只返回所有元素 2.如果确实有n个元素全部返回 3.如果还有更多,只返回第一个n元素

答案 1 :(得分:1)

在迭代时,您通常不应从列表中删除,但这不是正确的:

for i in range(n,contours_count):
    contours.remove(contours[i])
    i -= 1

i -= 1不会产生实际效果,因为后续迭代中的i是来自range的下一个elmnt。由于您似乎想要第一个n轮廓,只需执行:

contours = contours[:n]