我有从图像中提取的2D线段。所以我知道它们的终点坐标。另外,我有一些参考2d线段。两个线段现在都是矢量形式。与参考线和提取线相比,我有大量的提取线段。
我想要做的是从我的提取中找到每条参考线的共轭线段。那就是我想匹配线段。但是,为了减少搜索区域,我希望以这样的方式限制它,即通过在参考线段周围定义缓冲区。
(1)我的第一个问题是如何用c ++实现这个缓冲区,因为我缺乏几何理论。
注意:我不想使用边界框并寻找沿参考线定向的矩形缓冲区。
(2)我的第二个问题是,如果我知道矩形缓冲区限制,那么我应该使用哪种类型的概念来避免不必要的线段搜索。
实际上,我正在寻找几何基本方法
请不要认为这是家庭作业,因为我的数学很差,我真的很挣扎。 提前谢谢。
请看一下这个例子。如果我拿边界框(蓝框)不必要的线来,如果它是一个缓冲矩形(红色),它面向主参考线(深黑色)几条线来。
黑线是 - 参考线和虚线是基于图像的提取线
答案 0 :(得分:1)
第一个建议
查看KD-Tree和R-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
}
}
要检查点与段的距离,请阅读此Shortest distance between a point and a line segment