python - 从轮廓列表中删除 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 个元素的列表!)本身是否是另一个列表的成员时是否存在一些模棱两可的情况?
解决方案
你已经删除了它。出现错误是因为您尝试将其删除两次。
尝试这个:
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)
推荐阅读
- c# - 使用 msgkit 将 eml 转换为 msg 时,Outlook 不会在预览中显示日期
- junit - 在 JUnit5 中使用 TestSuites
- swift - 在 uitableviewcell xib 中的 uicollectionview 中将图像设置为 imageview
- python - 为什么我得到 QuerySet 对象没有属性用户
- erlang - Erlang 无效的守卫表达式
- javascript - 如果1不是0,如果值相似,如何找到2个数据之间的相似性
- php - Laravel - 为守卫(auth)设置别名
- python - 如何在 django 模型中实现选择字段?
- mysql - 如何根据左连接条件获取mysql值
- python - sklearn.tree.tree 模块在 0.22 版中已弃用,并将在 0.24 版中删除