从一系列点识别线段

时间:2012-02-26 03:37:56

标签: geometry 2d line sketching

给定2D点的输入,我想将它们分成几行。因此,如果绘制锯齿形样式线,则应将每个线段识别为线。通常,我会使用OpenCV cvHoughLines或类似方法(具有异常值移除器的PCA),但在这种情况下,程序不允许产生“误报”错误。如果用户绘制一条线并且无法识别 - 它没关系 - 但是如果用户绘制一个curcle并且它是一个正方形 - 那就不行了。所以我在错误上有一个上限 - 但是如果它是一条长线并且某些点与近似线的距离更大,那么它就可以了。总结:

- 线检测 - 没有误报 - 有界,动态调整错误

哦,这些点是按顺序绘制的,就像手绘一样。

至少它不一定要快。这是一个素描工具。有人有想法吗?

1 个答案:

答案 0 :(得分:2)

这与语音和手势识别具有相同的难度。换句话说,你永远无法100%确定你找到了所有角落/交叉点,而你发现的那些你永远不能100%确定它们是正确的。你不能绝对肯定的原因是因为含糊不清。用户可能已经进行了一次击打,打算创建两条直线相交的线。但如果他们迅速做到了,那么“角落”可能会非常圆,所以不会被发现。

所以你永远无法避免误报。您可以做的最好的事情是通过探索几种可能的细分来缓解它们,并使用上下文信息来确定哪种细分最有可能。

每年都有很多关于草图分割的论文。这似乎是一个非常基本的问题,但它仍然是一个开放的话题。我使用的是德克萨斯A& M,名为MergeCF。本文很好地总结了这一点:http://srlweb.cs.tamu.edu/srlng_media/content/objects/object-1246390659-1e1d2af6b25a2ba175670f9cb2e989fe/mergeCF-sbim09-fin.pdf

基本上,您会发现曲率较高的区域(高于平均曲率的某些部分)慢速(因此您需要时间戳)。结合曲率和速度可以提高初始拟合度。这将为您提供点集群,您可以以某种方式将其缩减为单个点(例如,最接近集群中间的点,或具有最高曲率的点等)。然而,这是中风的“过度拟合”。算法的下一个阶段是迭代选择最小的段,并看看如果它与其相邻段之一合并会发生什么。如果合并不会过多地增加整体错误,则删除分隔两个段的点。冲洗,重复,直到你完成。

我看了新的分段器已经有一段时间了,但我认为没有任何突破。

在我的实现中,我在初始阈值中使用曲率中值而不是 mean ,这似乎给了我更好的结果。我在这里进行了大量修改的实现,这绝对不是一个自包含的东西,但它可能会给你一些见解。 http://code.google.com/p/pen-ui/source/browse/trunk/thesis-code/src/org/six11/sf/CornerFinder.java