这一期我们将一起来探讨挥动手势的设计
挥动可以说是手势识别的一大重点
除了第三期说的点击以外,最常用的就是挥动了,常见的有挥手、拖拉等
—我是目录—
动作识别
手势
|- 触碰
|- 挥动
|- 触发机制
|- 双手缩放
姿势
|- 关键知识
|- 设计方案
|- 前景与限制
—目录结束—
挥手
我们经常有一种需求,就是希望通过特定的动作“唤醒”设备,让设备登陆用户或者响应用户接下来的动作。
挥手就是一种很好的Say Hi的方式,那么怎么来实现呢?
首先我们知道,微软的Kinect SDK把人的关节点分为20个关节。
于是一种简单的实现就是通过关节点的X轴位置(如handLeft.X和elbowLeft.X)来判断
利用一个自动生成时间戳的链表,我们就可以知道当它们的X轴在什么时候重合
通过在检查在特定时间内,有多少个时间戳,就可以得知手挥动了多少次。
更进一步的,我们希望elbow.Y 在hand.Y上方时才视为一次有效的摆手,这样就避免了下摆手的误触发。
当然,也可以限制elbow.Z比hand.Z 远,这样就避免了背身时的触发。
拖拉
有了挥手做基础,拖拉就更好理解了。
之前我们说过,人手臂的活动有一个范围限制。
于是我们可以把图中蓝色的空间用二元一次方程(y=ax+b)映射到屏幕上
具体的,针对不同人群,这个空间到底该设多大呢?
如果采用固定的像素点数,考虑到大人/小孩、远/近等差别,显然很难取出合适的宽高值。
美术中有“头身”这个概念,通过这个粗略的估算,程序很快就能截取出适合自己的空间范围。
首先,人体平均的的身高为7个半头身(注:若套用模型时请注意艺术中通常用8头身),即身高约等于7个半头部的高度。
其次,锁骨到腰部为2头,这个距离也等同于上颈部到上臀部。
水平方向上,左右肩宽约为2头
据此,我们通过获取用户shoulderLeft到shoulderRight的距离(也可以是其他关节),取2头作为单位,配合关节点做参考点(可采用不容易受手势影响的点,如shoulderCenter),很快就可以根据前面蓝色的图取出大致合适的控件,剩下的就是优化的工作了。
比较常见的做法是选取一个1:1大小的控件,然后映射到1:1或者4:3的屏幕上,具体比例问题可以由方程控制。
此时当我们的手在指定空间内移动时,就充当了“鼠标”的指向作用,有了这个功能,再配合特定的触发机制就可以完成拖拉等手势。
小结
由于这些手势的判断多为帧间运算,我们需要时刻注意避免使用过于复杂的算法,否则每秒60次的运算有可能会拖垮CPU,造成严重的延迟。从最简单的方法开始,根据实际情况不断优化是一个很好的发现合适算法的途径。
下一期我们将一起探讨触发机制的问题
谢谢观赏
转载自http://www.kinectutorial.com/?p=824本人纯粹是收藏,方便以后查看~