2

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

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

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

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

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

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

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

请看例子。如果我采用边界框(蓝色框),则出现不必要的线条,如果它是面向主参考线(深黑色)的缓冲区矩形(红色),则出现几条线。

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

在此处输入图像描述

4

1 回答 1

1

第一个建议

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

第二个建议

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

在此处输入图像描述

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

灰色胶囊中的那些片段适合与参考片段匹配,您可以忽略其他片段。(如果提取段的两个点处于灰色区域,则它可能是与参考段匹配的好候选。否则您可以忽略该段。)

一条线段有两个点作为起点和终点,每个点有两个分量,分别是 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
  }
}

要检查点到线段的距离,请阅读此点和线段之间的最短距离

于 2013-01-16T16:34:44.653 回答