如何从鼠标手势生成的点列表中确定所有线段?

Chr*_*ris 7 math drawing gesture-recognition gesture

目前我正在一家软件公司实习,我的任务之一就是实现鼠标手势的识别.其中一位资深开发人员帮助我开始使用$ 1 Unistroke Recognizer http://depts.washington.edu/aimgroup/proj/dollar/提供代码/项目.从广义上讲,我得到了1美元Unistroke识别器正在做什么以及它是如何工作的,但是我试图理解它的所有内部/更精细的细节有点不知所措.

我的问题是我正在尝试识别将鼠标向下移动然后向上移动的姿势.$ 1 Unistroke识别器确定我创建的手势是一个向下的手势,这实际上是它应该做的.我真正想要它做的是说"我认识到一种沮丧的手势,然后是一种向上的手势."

我不知道对$ 1 Unistroke Recognizer缺乏了解是否完全让我头疼,但是有没有人有任何关于如何识别两个不同的手势,从向下移动鼠标然后向上移动的想法?

这是我的想法,我认为可能会帮助我,但我会喜欢那些专家,甚至比我更了解我,让我知道你的想法.任何帮助或资源,你知道将被大大赞赏.

我的应用目前如何工作:

我当前的应用程序的工作方式是,当用户按住鼠标左键时,我从鼠标光标所在的位置捕获点.然后,点列表被馈送到手势识别器,然后它会吐出它认为是对应于捕获点的最佳形状/手势.

我的想法:

我想要做的是在我将点数提供给手势识别器之前,以某种方式通过所有点并将它们分解成单独的线条或曲线.这样我可以一次一个地提供每条线/曲线,并且从向下,向上,向左,向右,对角线和曲线的基本运动中我可以确定最终的形状/姿势.

我认为在我的点列表中是否有单独的线条的一种方法是对点组进行采样并查看它们的斜率.如果采样点组的斜率与其他一组采样点的X%不同,则可以安全地假设确实存在单独的线.

我认为是我思考中可能存在的问题:

  • 我在哪里确定一条线的终点和一条单独线的开头?如果我要使用检查一组点的斜率的想法然后确定存在单独的线并不意味着我已经发现了单独线的斜率.例如,如果您要绘制一个直角的直边"L"并采样"L"角落周围的点的斜率,您会看到斜率会给出合理的指示,表明存在单独的线但是这些点与单独一行的开头不对应.

  • 如何处理曲线不断变化的斜率?我使用的手势识别器已经按照我想要的方式处理曲线.但是我不希望我用来确定单独行的方法继续在曲线中寻找这些所谓的单独行,因为当我对点组进行采样时,它的斜率一直在变化.一旦斜率连续多次变化超过X%,我会停止采样点吗?

  • 我没有使用正确的"类型"数学来确定单独的行.数学不是我最强的科目,但我做了一些研究.我试着调查Dot Products,看看是否会指向某个方向,但我不知道是否会.有没有人使用Dot Prodcuts做这样的事情或其他方法?

最后的想法,备注和谢谢:

我觉得我的问题的一部分是我不知道如何完全问我的问题.如果已经问过(以这种或那种方式)这个问题并且存在可以用谷歌搜索的解决方案,我不会感到惊讶.但是我在Google上的搜索结果没有提供任何解决方案,因为我还不确切知道如何提出我的问题.如果你觉得这很令人困惑,请告诉我在哪里和为什么,我会帮助澄清它.这样做也许我在Google上的搜索会变得更精确,我将能够找到解决方案.

我只是想再次感谢阅读我的帖子.我知道它很久但不知道在哪里可以问它.Imma与办公室周围的其他人交谈,但我在学校使用的所有最佳解决方案都来自StackOverflow社区,所以我非常感谢你.

编辑到这篇文章:

(7/6 4:00 PM)我想到的另一个想法是在Min/Max点之前比较所有点.例如,如果我将鼠标向下移动然后向上移动,我的起点将是当前的最大点,而我开始向上移动鼠标的点将是我的最小点.然后我可以继续前进,看看在最小点之后是否有任何点,如果是这样,可能会有新的潜在线.我不知道这对于像星星这样的其他形状有多好,但这是我要研究的另一件事.以前有人做过类似的事吗?

Sta*_*n E 1

如果您的问题可以缩小到将一般曲线分解为直线或平滑弯曲的部分线,那么您可以尝试这个。

在非常简单的情况下,比较各段的斜率并识别大于某个阈值的断点。想象一个完美的 L 形,两条直线之间有一个直角。显然,只要阈值在 0 到 90 度之间,角点就是唯一一个斜率差高于阈值的点,因此是一个可识别的断点。

然而,垂直线和水平线可能会稍微弯曲,因此阈值需要足够大,才能将这些微小的斜率差异作为断点而忽略。您还必须决定算法应选取多尖锐的角作为中断点。是否需要 90 度或更高,或者甚至 30 度就足够了?这是一个重要的问题。

最后,为了使其稳健,我不会满足于比较两个相邻线段的斜率。手可能会颤抖,拐角可能会被磨平,而找到直线和尖角的理想条件可能永远不会出现。对于研究中断的每个点,我将取前N个段的平均斜率,并将其与后续N个段的平均斜率进行比较。这可以使用运行平均值来有效地实现。通过选择一个好的样本数N(取决于输入的准确性、总点数等),算法可以避免噪声并做出更好的检测。

基本上算法是:

  • 对于每个调查点(序列中的开始N 个点和结束前的 N 个结束点。)
    • 计算前N个线段的平均斜率。
    • 计算接下来N 个线段的平均斜率。
    • 如果平均值的差异大于阈值,则将当前点标记为断点。

这完全超出了我的想象。您必须在您的应用程序中尝试它。