【问题标题】:Touch gesture recognition for phones without neural networks没有神经网络的手机的触摸手势识别
【发布时间】:2011-10-02 22:31:47
【问题描述】:

我正在为手机开发手势识别程序。我想要完成的是让用户绘制自己的“模式”,然后让这些模式做不同的事情。

存储模式 - 我称之为“模式保存”算法

当手势最初被绘制和记录时。这也是我用来抓取用户绘制的内容并用于比较的算法:

  1. 用户开始绘制他的图案。对于每 15 个像素,一个点被放置在一个称为“列表”的列表中。
  2. 图案绘制完成后,将从列表中删除第一个和最后一个点。
  3. 对于现在列表中的每个点,它们的连接被转换为一个方向枚举(包含 8 个方向),然后将其添加到一个列表中,现在称为“列表”。
  4. 过滤器 1 开始,一次通过列表中的 3 个方向。如果左方向与右方向相同,则去掉中间方向。
  5. 过滤器 2 开始,删除重复的路线。
  6. 过滤器 3 开始,去除假定的噪音。假设的噪声是通过反复出现的成对的重复方向来检测的。 (例如,“left upper-left left upper-left”正在变成“upper-left”或“left”)。
  7. 过滤器 4 开始,去除更多假设的噪音。假设噪声是通过(再次)一次比较列表中的 3 个方向来检测的,如步骤 4(过滤器 1)中所示,但是在未检查方向是否完全相等的情况下,仅几乎相等(例如,左侧是几乎等于“左上”和“左下”)。

路线列表现在存储在一个文件中。路线列表保存为手势本身,以供以后比较。

比较模式

一旦用户绘制了一个图案,“图案保存”算法也会用于该图案(但只是为了过滤掉噪音,而不是实际保存它,因为那会很愚蠢)。

然后将此过滤后的模式与手势列表中的所有当前模式进行比较。这种比较方法描述起来相当复杂,而且我的英语也没有我应该的那么好。

简而言之,它会遍历用户输入的手势,并针对该手势中的每个方向与所有其他手势方向进行比较。如果一个方向相似(如上面的算法所示),那没关系,它会继续检查下一个方向。如果连续 2 次不相似,则视为不匹配。

结论

所有这些都是我自己开发的,因为我喜欢做我所做的事情。我很想知道 Internet 上是否有任何地方可以找到与我正在做的事情类似的资源。

我不想要任何神经网络解决方案。可以说,我希望它“在控制之下”,无需任何培训。

如果您有任何方法可以让我更好地完成上述算法,一些反馈也会很好,并且也会起作用。

你看,它在某些情况下工作得很好。但是例如,当我制作一个“M”和一个倒置的“V”时,它无法识别出区别。

我们将不胜感激。哦,如果您认为我描述的一切都很好,请投票赞成这个问题!

【问题讨论】:

标签: c# gesture-recognition


【解决方案1】:

总体思路

  1. M 和 V 会不会因为您将第一个点和最后一个点都弄丢了而显得相同?丢弃第一个和最后一个点似乎有点多余,因为无论如何您都是在方向上操作(三个点的列表已经导致只有 2 个方向的列表)。

  2. 另外,我建议只制作这样的原型。您会发现自己是否容易受到噪音的影响(我预计不会,因为“每 15 个像素”)。

Re:比较阶段

我认为通过阅读 Peter Norvigs 出色的 16 行拼写检查文章,您将获得一些更通用的想法来匹配“密切相关”的动作。 here

【讨论】:

  • 我删除第一点和最后一点的原因是由于 Windows Phone 上的触摸特性。在手机上运行时,第一个点和最后一个点经常显示为噪音。
【解决方案2】:

您基本上是在使用基于手势方向的 Markovian(ish) FSM 来计算形状的“接近度”。你不应该。 M 无论是从左到右还是从右到左绘制,看起来都一样。 (也许我误解了这个细节。)

您应该使用openCV 之类的东西来比较形状。特别是cvMatchShapes()。这个函数使用Hu moments(一个well-established metric)来比较binary shapes的“亲密度”。 Hu 矩用于comparing protein binding sites,并作为更复杂的形状识别算法(如 SURF)的一部分。对于您正在尝试做的事情,它应该足够好。

【讨论】:

  • 有趣,但我不想使用第三方组件。
猜你喜欢
  • 2017-01-10
  • 1970-01-01
  • 2011-09-18
  • 2018-08-19
  • 2015-10-11
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
相关资源
最近更新 更多