在多点触控环境中,用于手势识别的方法/算法有哪些?

19
在多点触控环境中,手势识别是如何工作的?有哪些数学方法或算法用于识别或拒绝可能的手势数据?
我制作了一些反射手套和红外LED阵列,配合Wii遥控器使用。Wii遥控器进行内部斑点检测,跟踪4个红外光点,并通过蓝牙适配器将此信息传输到我的计算机。
这基于Johnny Chung Lee的Wii研究。我的精确设置与荷兰研究生在此处展示的设置完全相同。我可以轻松地跟踪2D空间中4个点的位置,并编写了基本软件来接收和可视化这些点。

alt textalt textalt text

荷兰的学生们已经从他们基本的捏-点击识别中获得了很多功能。如果可以的话,我想更进一步,实现一些其他手势。
手势识别通常如何实现?除了任何琐碎的事情之外,我该如何编写软件来识别和识别各种手势:各种划动、圆形运动、字母轨迹等。
6个回答

11

8
一种看待它的方式是将其视为压缩/识别问题。基本上,您想要获取大量数据,丢弃其中大部分,并对其余部分进行分类。如果我从头开始做这件事,我可能会按照以下步骤进行:
- 使用滚动历史窗口 - 获取起始帧中四个点的重心,保存并从所有帧中的所有位置中减去它。 - 将每个帧分解为两个组成部分:星座的形状和相对于上一帧的CofG的移动。 - 也要保存最后一帧的绝对CofG。 - CofG变化的系列给出了刷卡、挥手等动作。 - 星座变形的系列给出了捏等动作。
在看到您的照片(每只手上有两个点,而不是一只手上有四个点)之后,我会按照以下方式修改上述内容:
  • Do the CofG calculation on pairs, with the caveats that:
    • If there are four points visible, pairs are chosen to minimize the product of the intrapair distances
    • If there are three points visible, the closest two are one pair, the other one is the other
    • Use prior / following frames to override when needed
  • Instead of a constellation, you've got a nested structure of distance / orientation pairs (i.e., one D/O between the hands, and one more for each hand).
  • Pass the full reduced data to recognizers for each gesture, and let them sort out what they care about.
  • If you want to get cute, do a little DSL to recognize the patterns, and write things like:

    fire when
        in frame.final: rectangle(points) 
      and
        over frames.final(5): points.all (p => p.jerk)
    

    or

    fire when
        over frames.final(3): hands.all (h => h.click)
    

@MarkusQ,感谢您的评论。仅供参考,荷兰学生点击算法的工作原理如下:如果Wiimote失去对一个点的跟踪,并且其配对中的另一个点在接近阈值内,则它是一个“点击”。 - mmcdole
当手指靠近时,Wiimote 将把两个手指视为一个 blob 而不是两个。因此,它失去了一个点。当你的手不再可见时,这也可能发生,因此使用接近阈值来防止误报。 - mmcdole

1

0

嗯..我过去一年左右一直在开发手势识别,但我不想透露太多,因为我正在尝试申请专利:) 但是...我们使用了自适应增强算法,虽然你正在做的看起来本质上不同。您只需要处理4个数据点,因此我认为您不需要真正“减少”任何内容。

我要调查的是像Flash这样的程序如何将手绘的自由线条变成实际的圆。似乎您可以跟踪大约一秒钟的时间以获取点,然后以某种方式“平滑”路径,然后您可能可以用硬编码解决手势(如果您使它们足够简单)。否则,您将需要使用学习算法。神经网络可能有效...我不知道。只是随意提出想法:) 也许还要看看 OCR 如何完成...甚至霍夫变换。在我看来,这是一个识别形状而不是手势的问题。


基本上,画一个圆圈、一个X或在不同方向上划过所有4个点都是手势。在我的2D世界里,我的手势是形状。不过我还需要进一步研究学习算法。 - mmcdole
嗯,没错,它们确实是手势,我只是想说如果你能弄清楚它形成了什么形状,你也可以弄清楚它是什么手势。也就是说,我认为手势识别可以归结为形状识别(这可能是一个更容易解决的问题--更少的概率性)。 - mpen

0

我看过的大多数简单手势识别工具都使用基于向量的模板来进行识别。例如,您可以将右滑定义为“0”,将勾号定义为“-45, 45, 45”,将顺时针圆形定义为“0, -45, -90, -135, 180, 135, 90, 45, 0”等。


-1

我对这种数学并不是很熟悉,但我曾经在某处读到人们有时会使用马尔可夫链隐马尔可夫模型来进行手势识别。

也许有一些更了解计算机科学这一方面的人可以进一步阐述并提供更多细节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接