这几天做Kinect开发,需要检测手在三维空间中的位置,检测时不免会出现抖动的情况,这时候可以调用SDK自带的平滑算法。
调用方法:(以下代码使用的是最新SDK 1.5正式版)
声明传感器变量
KinectSensor sensor;
然后窗口的Load事件中我们都要写:
this.sensor.SkeletonStream.Enable();
此时的函数不接受任何参量,也就是系统不会进行平滑,开启平滑算法的方法就是向Enable()方法中传参
声明TransformSmoothParameters变量
TransformSmoothParameters
smoothParameters;
为平滑算法的参数赋值:
smoothParameters.Smoothing = 0.5f; // 设置处理骨骼数据帧时的平滑量,接受一个0-1的浮点值,值越大,平滑的越多。0表示不进行平滑。
//smoothParameters.Correction; // 接受一个从0-1的浮点型,值越小,修正越多
//smoothParameters.JitterRadius; // 抖动半径,单位为m,如果关节点“抖动”超过了设置的这个半径,将会被纠正到这个半径之内
//smoothParameters.MaxDeviationRadius; // 用来和抖动半径一起来设置抖动半径的最大边界,任何超过这一半径的点都不会认为是抖动产生的,而被认定为是一个新的点。该属性为浮点型,单位为米
//smoothParameters.Prediction; // 返回用来进行平滑需要的骨骼帧的数目
this.sensor.SkeletonStream.Enable(smoothParameters); // 开启骨骼流,利用平滑
阈值的选取没有什么方法,大家需要根据具体情况调整……这是最囧的一点,我也曾经想过一些平滑算法,但是水平不够,效果也不好
平滑的原理就是低通滤波器
注意:
一定要提前定义一个TransformSmoothParameters变量,然后用这个变量作为Enable()方法的参数;
走过的弯路:
由于没有定义一个临时的变量TransformSmoothParameters smoothParameters作为Enable的参数,而是直接对this.sensor.SkeletonStream.SmoothParameters赋值,就会提示错误:
无法修改××的返回值,因为它不是变量