0

给定二维点的输入,我想将它们分割成线。因此,如果您绘制锯齿形线,则每个线段都应被识别为一条线。通常,我会使用 OpenCV 的 cvHoughLines 或类似的方法(带有异常值去除器的 PCA),但在这种情况下,程序不允许出现“假阳性”错误。如果用户画了一条线并且它没有被识别 - 没关系,但如果用户画了一个 curcle 并且它显示为一个正方形 - 那就不行了。所以我对错误有一个上限 - 但如果它是一条长线,并且某些点与近似线的距离更大,那又可以了。总结:

- 行检测 - 无误报 - 有界,动态调整误差

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

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

4

1 回答 1

2

这与语音和手势识别具有相同的困难。换句话说,你永远不能 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

于 2012-02-26T16:34:44.093 回答