Kinect官网给出了几个常用的关节点数据的滤波算法:Skeletal Joint Smoothing White Paper
我参考White Paper和基于虚拟现实的人机双臂主动运动传递方法研究 这篇论文总结了一下。
——————————————————————————————————————————————————————————————————————————————————————————
1)自回归滑动平均滤波(Auto Regressive Moving Average (ARMA) Filters)
a:滑动平均项参数
b:自回归项参数
自回归滑动平均滤波器是一种线性滤波器算法,其输出是前N个滤波前数据的权重平均值与前M个滤波后数据的权重值之和。
由于参数有四个N、M、a、b,我能力有限虽然方程用Python写好了,但没有调出合适的参数,详细设置参数的方法我还没看,在这个文献中Brockwell, Peter J., and Richard A. Davis, Time Series: Theory and Methods, 2nd edition. Springer, 2009.,
2)均值滤波(Simple Averaging Filter)
这是最简单的关节滤波器,对前N+1个输入值做均值处理。在人体运动缓慢的情况下,该滤波器能在n时刻对接下来的n+k时刻的值进行预测。N越大曲线越平滑,但会引入跟多的延时,延时大小和N大小成正比。
均值滤波具有恒定的偏差(constant bias),用双滑动平均滤波可以消除。
3)双滑动均值滤波(Double Moving Averaging Filter)
双滑动均值滤波应用广泛,常用于预测有线性变化趋势的数据。
与滑动均值滤波(moving averaging filter)相比双滑动均值滤波的优点是对数据变化更加敏感。
但是我算不出
4)卷积滤波器(Savitzky–Golay Smoothing Filter)
常被称作多项式平滑滤波器或者最小二乘滤波算法,他利用传感器采集的值作为输入,某一邻域的最小二乘法拟合曲线上的值作为输出。k阶多项式定义如下:
如果我们使用N个先验样本和M个未来样本作为相连样本,则滤波器找到
要实现Savitzky-Golay滤波器,只需要选择合适的滤波器阶数K,并确定应使用前后多少个采样(即选择N和M)。然后,可以可使用现成的算法离线计算系数ai,并且使用这些系数很容易计算滤波器输出。一般来说,Savitzky-Golay滤波器对于的频率跨度大且没有噪声的输入的数据很有用,因此,Savitzky-Golay滤波器是NUI关节滤波很好的选择。(NUI joint中的NUI是什么意思我不懂)
K = 1,将直线拟合到输入数据,这通常称为线性回归。K = 2和K = 3,分别拟合抛物线和三次曲线。 n的选择影响滤波器平滑效果,其中使用K = 3的三次曲线应该是NUI关节滤波的较好选择,因为它是能够显示拐点且平滑的最低次数多项式。使用高阶多项式会产生带有太多局部最小值和最大值的跳跃曲线,这会导致平滑效果减弱。
5)抖动去除滤波器
通过限制每帧中输出的变化来抑制输入的跳变。如果输入的数据和以前的输入数据之间的差异和校医一个阈值,那么滤波器的输出值不变。否则,该滤波器将发生变化,这些变化可以通过使用不同的方法来完成。例如,抖动去除滤波器的下列变量可以使用一个指数滤波器(Exponential Smoothing Filter)来抑制输入大的变化:
α称为阻尼因子,0≤α≤1。用
之前的所有输入都有助于平滑滤波器输出,但它们的贡献会因参数1-α的功率增加而衰减。由于n取决于所有过去的输入,所以指数滤波器被认为具有对所有过去输入的无限记忆。类似于简单的平均滤波器,指数滤波器将一条水平直线与输入数据拟合。不同之处在于,指数滤波器对近期输入数据赋予相对较高的权重,并且相比于简单的平均滤波器,其对输入的近期变化的反应更为敏感。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
第一篇博客,原谅我不通顺的翻译和逼死强迫症的排版。Skeletal Joint Smoothing White Paper上还给出了另外五钟滤波方法,我实在是不想写了,累死了,以后有空再写吧,或者就再也不写了看心情。