做Kinect开发的人士肯定少不了用到动态手势,对于动态手势的识别,我想大家基本都会研究过判定的算法。今天我在这里向大家介绍一个我自己发明的,而且还挺不错的算法,叫倒序识别法,这个算法可以说能把一部分的动态手势甚至动态姿势识别的精确度提高百分百。
拿一个非常简单的例子来作介绍,就是挥手翻动PPT的动作检测。我把我前后两次的算法介绍给大家:
最开始的检测方法叫做“抽样检测”,就是检测t与t+Δt两个时刻的位置是不是符合挥手的特征。这种方法之所以叫做抽样检测,是因为每次检测t与t+Δt与下次检测t+T与t+Δt+T之间的时间检测可以看成两次抽样,1/T就是抽样频率。
第一种方法的没有被延续使用,一是因为不好写,二是要必须检测两个点的信息,效率比第二种很低。当然一开始我把抽样周期定成了Δt,导致整个手势的识别非常不精准,因为采样率过低。
第二种方法就是今天要讲的倒序识别法,算法的具体流程如下:
1. 维护一个长度为两秒(根据具体手势的时间而定)的List,在Unity3D下如果要调用List需要using System.Collection.Generic。
2. 如果List长度不够两秒,继续添加。
3. 够两秒的长度之后,每次检测最新加入的数据是不是手势最后状态,比如说双手上抬,最后状态就是两只手在头上方。如果是最后状态,转到4.
4. 向前检测,根据帧率以及手势的发动时间(施法时间= =||)确定检测范围,比如说0.5s 到1s之前的范围,可以对应出数组的角标范围。如果是符合动作的逻辑,就返回true即可,然后清空List,防止返回多次true值。
倒序检测的优势:1. 在List的帮助下代码清晰简单。2.效率高,每次检测是不是手势的最后状态,相当于一次剪枝。3. 可以调整“回溯”的时间范围,比较方便调参。