我有一个数据结构Line,其大纲是:
class Line :
x1
y1
x2
y2
m
c
id
# other functions pertaining to the class
在主循环中,我有一个已经填充的行列表。
我想要做的是合并m和c值非常接近的线,这样我得到单行而不是检测到的多行
for line1 in allLines:
consolidateLines = []
for line2 in allLines:
if line1.id() == line2.id():
continue;
if abs(line1.m() - line2.m()) < SomeValue:
if abs(line1.c() - line2.c()) < someOtherValue:
consolidateLines.append(line2);
consolidateLines.append(line1);
# I want to remove all the lines in consolidatedLines.
# But since this is already in the loop, that is a problem.
# How do I accomplish this.
解释问题: 我有一个行列表。由于使用计算机视觉算法(霍夫变换)检测这些线,因此一些线彼此非常接近。那不太理想。因此,我试图巩固所有非常接近且具有接近方向的线。如果一行由y = mx + c表示,我试图:
- 合并列表中的所有行(可能有5条靠近的行),其中m和c的值几乎相同,并为这些行获取一行。
- 删除所有合并的行
- 添加我在列表中获得的新行。
醇>
答案 0 :(得分:1)
要从列表中删除重复项,您基本上需要将每个元素与列表中的每个其他元素进行比较。为了不进行两次比较,您需要在第一个循环+ 1的位置开始第二个循环。
以下代码执行此操作,如果找到重复项,则会跳过这两个值中的第一个(break
)命令:
consolidateLines = []
for i, line1 in enumerate(allLines):
for j, line2 in enumerate(allLines[i+1:]):
if abs(line1.m() - line2.m()) < SomeValue and
abs(line1.c() - line2.c()) < someOtherValue:
break # found a duplicate later in the list, skipping first occurrence
else:
# no duplicagte found -> add to list
consolidateLines.append(line1);