这与语音和手势识别具有相同的困难。换句话说,你永远不能 100% 确定你已经找到了所有的拐角/交叉点,而且在你发现的那些中,你永远不能 100% 确定它们是正确的。你不能绝对确定的原因是因为模棱两可。用户可能已经进行了一次笔划,打算创建两条以直角相交的线。但是如果他们很快就做到了,“角落”可能已经很圆了,所以不会被检测到。
因此,您将永远无法避免误报。您可以做的最好的事情是通过探索几个可能的细分来减轻它们,并使用上下文信息来决定哪个是最有可能的。
每年都有很多关于草图分割的论文。这似乎是一个非常基本的问题,但它仍然是一个开放的话题。我使用的是德克萨斯 A&M 公司,称为 MergeCF。本文很好地总结了这一点: http: //srlweb.cs.tamu.edu/srlng_media/content/objects/object-1246390659-1e1d2af6b25a2ba175670f9cb2e989fe/mergeCF-sbim09-fin.pdf。
基本上,您会发现具有高曲率(高于平均曲率的一部分)和慢速(因此您需要时间戳)的区域。曲率和速度的结合极大地改善了初始贴合度。这将为您提供点集群,您可以以某种方式将其减少为单个点(例如,最接近集群中间的点,或曲率最高的点等)。然而,这是中风的“过拟合”。算法的下一个阶段是迭代地挑选最小的段,看看如果它与它的相邻段之一合并会发生什么。如果合并不会过多地增加整体误差,则删除分隔两个段的点。冲洗,重复,直到完成。
自从我研究新的分段器以来已经有一段时间了,但我认为没有任何突破。
在我的实现中,我在初始阈值中使用曲率中位数而不是平均值,这似乎给了我更好的结果。我的大量修改的实现在这里,这绝对不是一个独立的东西,但它可能会给你一些见解。http://code.google.com/p/pen-ui/source/browse/trunk/thesis-code/src/org/six11/sf/CornerFinder.java