Kinect手势分析

use*_*924 6 c# wpf visual-studio-2010 kinect

我正在使用官方Kinect SDK进行kinect应用程序.

结果我想1)能够识别身体已经挥动了5秒.做一些事情,如果它2)能够识别一条腿倾斜5秒.如果有的话,做点什么.

谁知道怎么做?我正在WPF应用程序中.

想有一些例子.我对Kinect很新.

在此先感谢您的帮助!

Coe*_*ect 17

Kinect为您提供了跟踪的骷髅,您必须完成其余的工作.基本上,您需要为每个手势创建一个定义,并在每次触发SkeletonFrameReady事件时针对骨架运行该定义.这并不容易.

定义手势

定义手势可能会非常困难.最简单(最简单)的手势是在单个时间点发生的手势,因此不依赖于肢体的过去位置.例如,如果您想要检测用户何时将手举过头顶,可以在每个帧上检查.更复杂的手势需要考虑一段时间.对于你的挥动手势,你将无法从一个框架告诉一个人是在挥手还是只是把手放在他们面前.

所以现在你需要能够存储过去的相关信息,但相关的信息是什么?你应该保留最近30帧的存储并运行算法吗?30帧只能获得第二个值的信息..也许是60帧?或者你的5秒,300帧?人类不会那么快,所以也许你可以使用每五帧,这将使你的5秒回到60帧.更好的想法是从框架中挑选和选择相关信息.对于挥动手势,手的当前速度,移动的时间,移动的距离等等都可能是有用的信息.

在您弄清楚如何获取和存储与手势相关的所有信息之后,如何将这些数字转换为定义?挥杆可能需要一定的最小速度或方向(左/右而不是上/下)或持续时间.但是,此持续时间不是您感兴趣的5秒持续时间.此持续时间是假设用户挥动所需的绝对最小值.如上所述,您无法确定一帧中的波形.你不应该确定2,或3或5的波,因为这还不够.如果我的手抽搐了几分之一秒,你会认为是波吗?可能有一个甜蜜的地方,大多数人会同意从左到右的运动构成一个波,但我当然不太清楚它在算法中定义它.

要求用户在一段时间内做某种姿势还有另一个问题.无论您如何编写定义,机会都不是五秒内的每一帧都会显示为波形.你可以很容易地确定是否有人用手捂住他们的头五秒钟(因为它可以在单帧的基础上确定),对于复杂的手势来说,这样做要困难得多.虽然挥手并不复杂,但它仍然显示出这个问题.当你的手改变波浪两侧的方向时,它会停止移动几分之一秒.你还在挥手吗?如果你的回答是肯定的,那么挥动得更慢,这样你就可以在任何一侧停下来.这种暂停还会被视为浪潮吗?在五秒钟手势的某个时刻,定义将无法检测到波浪.所以现在你需要考虑对手势持续时间的宽大处理.如果在过去五秒钟内95%的挥手姿势发生,那还不错吗?90%?80%?

我想在这里提出的观点是没有简单的方法来做手势识别.你必须仔细考虑手势并确定某种定义,将一堆关节位置(骨架数据)转化为手势.您需要跟踪过去帧中的相关数据,但要意识到手势定义可能不完美.

考虑用户

所以现在我已经说过为什么五秒波很难被发现,请允许我至少考虑一下如何做到这一点:不要.您不应强制用户在设定的时间段内重复基于动作的手势(五秒波).令人惊讶的是令人费解,而不是人们对计算机的期望/期望.点击是即时的; 我们点击后立即收到回复.没有人希望在打开扫雷之前必须按住一下五秒钟.如果持续执行一些动作,例如使用手势在列表中循环,则在一段时间内重复手势是可以的 - 用户将理解他们必须继续执行手势以在列表中移动更远.这甚至使手势更容易检测,因为您不需要过去5秒钟的信息,而只需要足够的信息来了解用户现在是否正在做手势.

如果您希望用户在一段时间内保持手势,请将其设为静止手势(将手放在某个位置x秒钟比挥手要容易得多).提供一些视觉反馈也是一个非常好的主意,说计时器已经启动.如果用户搞砸手势(错误的手,错误的地方等)并最终站在那里等待发生的事情5或10秒,他们将不会高兴,但这不是这个问题的一部分.

从Kinect手势开始

从小开始..真的很小.首先,确保您了解SkeletonData类的方法.每个骨架上有20个关节,每个关节都有一个TrackingState.此跟踪状态将显示Kinect是否可以实际看到关节(已跟踪),是否根据骨架的其余部分(推断)计算关节的位置,或者是否已完全放弃尝试找到关节(NotTracked) .这些状态非常重要.您不想仅仅因为Kinect没有看到另一条腿并且报告虚假位置而将用户站在一条腿上.每个关节都有一个位置,这就是你如何知道用户站在哪里..一块一块.熟悉坐标系.

在您了解了如何报告骨架数据的基础知识之后,请尝试一些简单的手势.当用户将手举过头顶时,将消息打印到屏幕上.这只需要将每只手与头部关节进行比较,并查看其中一只手是否高于坐标平面中的头部.在你开始工作之后,转向更复杂的事情.我建议尝试滑动动作(手在身体前方,从右向左或从左向右移动一些最小距离).这需要来自过去帧的信息,因此您必须考虑要存储的信息.如果你能做到这一点,你可以尝试在很短的时间内串起一系列的滑动手势并将其解释为波浪.

tl;博士:手势很难.从小处开始,逐步建立起来.不要让用户为一个动作做重复动作,这很累人烦.包括基于持续时间的手势的视觉反馈.阅读这篇文章的其余部分.