我正在尝试采用最大的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
我检查了以前的答案,但我不知道在哪里使用a.any或a.all,我不知道为什么我应该在我的情况下使用它们! 我正在使用索引删除所以我没有看到导致歧义的比较!
谢谢
答案 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]