【问题标题】:Gradual cursor move algorithm - Kinect SDK渐进式光标移动算法 - Kinect SDK
【发布时间】:2011-09-07 23:04:53
【问题描述】:

我正在构建 Kinect SDK WPF 应用程序并使用 Kinect 移动“光标”/手对象。

我遇到的问题是,在每秒 30 帧时,由于 Kinect 的精度,光标实际上会有点不规律地跳跃(即,当你握着你的手时,对象仍会在 5px 的空间内移动)。

我正计划编写一个算法,它不仅将我的“光标”冲刺的 X/Y 移动到屏幕上的正确位置,而且更像是“将手移向 这个 X/Y 坐标”,这样它是一个更平滑的运动。

谁能给我指一个别人写的好书,这样我就可以避免重新发明轮子。

我知道这可能很常见,但由于我更像是一名业务开发人员,因此我不确定此类功能的名称,所以如果它是一个 n00b 问题,请提前道歉。

【问题讨论】:

    标签: c# wpf algorithm kinect


    【解决方案1】:

    当我使用 Kinect 时,我只是使用了一些简单的数学运算(我认为这称为线性回归)来移动到光标当前位置与其目标位置之间一定距离的点。获取光标的位置,获取用户的手所在的位置(转换为屏幕坐标),然后将光标移动到它们之间的某个点。

    float currentX = ..., currentY = ..., targetX = ..., targetY = ...; 
    float diffX = targetX - currentX;
    float diffY = targetY - currentY;
    float delta = 0.5f; // 0 = no movement, 1 = move directly to target point. 
    
    currentX = currentX + delta * diffX;
    currentY = currentY + delta * diffY;
    

    您仍然会感到抖动,具体取决于增量,但它会更加平滑,并且通常在较小的区域内。

    在相关说明中,您是否查看过 Kinect 的骨骼平滑参数?您实际上可以让 SDK 处理一些过滤。

    【讨论】:

    【解决方案2】:

    将您的输入值(那些跳跃位置)视为具有低频和高频部分的信号。低频部分代表粗略的位置/运动,而高频部分包含较小距离内的快速跳跃。

    因此,您需要或寻找的是低通滤波器。如果您设法使用正确的参数进行设置,这会过滤掉高频部分并留下粗糙(但与 Kinect 一样准确)的位置。该参数是滤波器的交叉频率。你必须玩一会儿,你就会看到。

    时间离散值的实现示例来自here(最初来自wikipedia):

    static final float ALPHA = 0.15f;
    
    protected float[] lowPass( float[] input, float[] output ) {
        if ( output == null ) return input;
    
        for ( int i=0; i<input.length; i++ ) {
            output[i] = output[i] + ALPHA * (input[i] - output[i]);
        }
        return output;
    }
    

    您可以将位置向量的 X 和 Y 分量的最后一个值放入此函数以平滑它们(input[0] 用于 X 和 input[1] 用于 Y,output[0]output[1] 是结果上一个函数调用)。

    就像我已经说过的,你必须为平滑因子找到一个很好的平衡ALPHA (0 ≤ ALPHA ≤ 1)

    • 太大,信号不够平滑,效果不够
    • 太小,信号会“过度”平滑,光标会滞后于用户的移动,惯性太大

    (如果您查看公式newout = out + alpha * (in - out),您会看到alpha值为0时,您只需再次使用旧的out值,因此该值永远不会改变;而值为1时,您有newout = out + in - out 这意味着你不平滑任何东西,但总是取最新的值)

    【讨论】:

      【解决方案3】:

      解决此问题的一个非常简单的想法是将光标显示在某个位置,该位置是过去一些位置的平均值。例如,假设您跟踪手的最后五个位置,然后在该位置显示光标。然后,如果用户的手相对静止,则帧与帧之间的抖动应该相当低,因为最后五帧手的位置大致相同,噪声应该被抵消。如果用户随后在屏幕上移动光标,则光标会在从旧位置移动到新位置时进行动画处理,因为当您考虑手的最后五个位置时,平均位置将在新旧位置之间缓慢插入职位。

      这种方法很容易调整。您可以转换数据点,使旧点的权重大于或小于新点,并且可以调整您保留的历史记录的长度。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多