如何使用2D矩形缓冲区沿2d线段限制搜索空间

时间:2013-01-16 16:07:55

标签: c++ algorithm image-processing geometry computational-geometry

我有从图像中提取的2D线段。所以我知道它们的终点坐标。另外,我有一些参考2d线段。两个线段现在都是矢量形式。与参考线和提取线相比,我有大量的提取线段。

我想要做的是从我的提取中找到每条参考线的共轭线段。那就是我想匹配线段。但是,为了减少搜索区域,我希望以这样的方式限制它,即通过在参考线段周围定义缓冲区。

  

(1)我的第一个问题是如何用c ++实现这个缓冲区,因为我缺乏几何理论。

注意:我不想使用边界框并寻找沿参考线定向的矩形缓冲区。

  

(2)我的第二个问题是,如果我知道矩形缓冲区限制,那么我应该使用哪种类型的概念来避免不必要的线段搜索。

实际上,我正在寻找几何基本方法

请不要认为这是家庭作业,因为我的数学很差,我真的很挣扎。 提前谢谢。

请看一下这个例子。如果我拿边界框(蓝框)不必要的线来,如果它是一个缓冲矩形(红色),它面向主参考线(深黑色)几条线来。

黑线是 - 参考线和虚线是基于图像的提取线

enter image description here

1 个答案:

答案 0 :(得分:1)

第一个建议

查看KD-TreeR-Tree。  <击> 它们用于分区空间以减少一些计算。并且有许多实现作为类库,与libkdtree相同。我之前亲自使用KD-Tree来减少在2D空间中找到最近邻域的比较,这并不简单,但它很有效。

第二个建议

不考虑定向矩形(要测试点是否在其中),您可以考虑点与线段的距离。

enter image description here

检查提取的片段的两个起点和终点是否足够接近片段,灰色区域是您定向矩形的良好近似值。

灰色囊中的那些段适合与参考段匹配,您可以忽略其他段。 (如果提取的片段中的两个点在灰色区域中,则可以很好地匹配参考片段。否则,您可以忽略该片段。)

一个段有两个点作为起点和终点,每个点有两个组成为X和Y.

Segment ref(r.start, r.end);

foreach(seg : extracted segments)
{
  if (DistancePointSegment(seg.start, ref)<D &&
      DistancePointSegment(seg.end  , ref)<D )
  {
    // Mark seg as a search candidate
  }
}

要检查点与段的距离,请阅读此Shortest distance between a point and a line segment