【问题标题】:How to merge multiple vectors if containing duplicate elements?如果包含重复元素,如何合并多个向量?
【发布时间】:2020-05-07 19:19:36
【问题描述】:

我正在尝试合并包含由houghLinesP 提取的属于一起的行的向量。

到目前为止,我有一个包含线段的向量:

vector<Vec4i> lines;

我还有一个算法可以检查线段是否足够相似以被认为属于其他线段(目前仅基于距离和角度):

    vector<vector<Vec4i>> lineClusters;

    for(Vec4i line1: sortedLines){
        Point l1o = Point(line1[0], line1[1]);
        Point l1d = Point(line1[2], line1[3]);
        vector<Vec4i> cluster;
        for(Vec4i line2: sortedLines){
            Point l2o = Point(line2[0], line2[1]);
            Point l2d = Point(line2[2], line2[3]);
            if ((getDistance(l1o, l1d, l2o, l2d) <= 20) and
                (abs(angle(l1o, l1d) - angle(l2o, l2d)) <= 10)) {
                cluster.push_back(line2);
            }
        }
        lineClusters.push_back(cluster);
    }

现在向量lineClusters 为每个线段包含一个属于该线段的线段向量。

我现在面临的问题是如何合并这些向量。基本上我想合并所有包含至少一个重复线段的向量,这样最后只剩下几个簇。

为了说明,我创建了一个小图像:

在此图像中找到了黑色线段。我想将它们合并成行。我绘制的圆圈代表可能被确定属于一起的线段,并由“lineClusters”内的向量表示。 (我没有把它们都画出来)

我真的不知道如何解决这个问题。有没有人想过如何解决这个问题?

编辑 为了使我的意图更加明显,我添加了以下图像: 。我正在尝试对线段进行分组以识别车道。

更新

遵循 Braaedy 提供的建议会导致以下结果:

通过调整判断线段是否属于一起的函数,显然可以改善结果。

【问题讨论】:

  • 根据您对它们的排序方式,您可以在一个轴上进行一次传递,在每个向量中维护一个迭代器,在每个迭代器增量后进行比较。
  • @Braaedy 我根本没有对它们进行排序。你建议以什么方式排序?我还更新了这个问题,让我的意图更加明显。
  • 一秒钟,我会写一个更复杂的回复作为答案。

标签: c++ opencv vector


【解决方案1】:

设置在这个问题中很重要。我假设vec4i 是一对描述直线段的点(例如(a,b,c,d)=>(x1,y1)->(x2,y2))

构造你的vec4i 使得 (x1

这允许您对所有线段进行一次从左到右的传递。 创建一个新结构,称之为 Line:

struct Line {
  std::vector<vec4i> segs;
  const vec2i &getEnd() const { *segs.rbegin(); }
};

定义一些新函数,可以确定两个端点是否“足够接近”以使其连接。创建Lines 的列表。

通用算法伪代码(其中 seg[0] 或 seg[1] 是段端点):

for (seg : Segments) {
  for (line : Lines) {
    if (close(line.getEnd()[1], seg[0])) {
      line.addSegment(seg)
      // break to next *segment*, a segment can only be added to one line.
    }
  }
  // reaching here means we didn't make attach the segment; start a new line.
  Lines.add(Line(seg))
}

这会连接所有从左到右的段。如果有像这样更复杂的线条,您将需要第二遍连接知道线条两端的线条:

      \
       \
--------

(水平、对角线)或图表末尾的后曲线

   \
    \
     |
    /
   /

(向下弯曲,向上弯曲)你想加入一条而不是两条。

【讨论】:

  • 感谢您抽出宝贵时间!这似乎很有希望。我现在有点累,但我明天一定会仔细看看,让你知道情况如何。
  • 好的,我会试着回过头来回答问题。
  • 谢谢你的建议,就像一个魅力。我添加了上面结果的图片。留给我的唯一事情是调整确定线段是否属于一起并实际对车道进行分类的函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 2012-04-06
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多