分组表示线条的点

时间:2015-11-10 12:19:52

标签: opencv line grouping cluster-analysis

我正在寻找一种能够解决这个问题的算法。

问题:

我有以下设定点:

Set of 2D points

我想将表示一行(带有一些epsilon)的点分组到一个组中。 因此,最佳输出将是:

Optimal output

有些说明:

  1. 该点属于唯一的一行。
  2. 如果该点可以属于两行,则它应该属于最强的。
  3. 当一条线具有更多的归属点时,该线被认为是另一条线。
  4. 算法不应涵盖所有点,因为它们可能是异常值。
  5. 该空间包含许多异常值,它可能达到总空间的50%。
  6. 性能至关重要,实时是必须的。
  7. 我到目前为止找到的解决方案:

    1)将其作为群集问题处理:

    此方法的主要缺点是点之间存在直接距离度量。距离度量在群集本身上(线性多少)。所以,我不能使用传统的聚类方法,我必须(据我所想)使用某种方法,例如,聚类我们的遗传算法,其中评估发生在while群集之间而不是两点之间。我也不想使用像遗传算法这样的东西我正在瞄准实时解决方案。

    2)累积对然后进行聚类:

    虽然难以直接对点进行聚类,但我想到提取点对,然后尝试将它们与其他点聚类。所以,我有两对之间的距离,可以代表线性(两对在真正的4点)。 这种方法的缺点是如何选择这些对?如果我依赖它们之间的Ecledian-Distance,它可能不准确,因为两个点可能彼此如此接近,但它们远远没有与其他点形成一条线。

    我感谢任何解决方案,建议,线索或说明。请您澄清一下。

    P.S。在考虑任何解决方案时,您可以使用任何现成的OpenCV函数。

1 个答案:

答案 0 :(得分:6)

建议Micka,我使用 Sequential-RANSAC 来解决我的问题。结果非常棒,完全符合我的要求。 这个想法很简单:

  1. 在点上应用RANSAC和拟合线模型。
  2. 删除所有RANSAC输出内容的点。
  3. 虽然有2个或更多点转到1。
  4. 我已经实现了自己的适配线RANSAC,但不幸的是我无法共享代码,因为它属于我工作的公司。但是,Srinath Sridhar实现了一个优秀的RANSAC配合线。该帖子的链接是:RANSAC-like implementation for arbitrary 2D sets

    根据我上面提到的3个简单步骤,很容易制作Sequential-RANSAC。

    以下是一些结果: enter image description here

    enter image description here