基于骨架运动的Kinect 3D手势识别 - 存在哪些库?

时间:2011-03-08 14:53:20

标签: gesture-recognition kinect openni

Kinect有哪些手势识别库(如果有)?现在我正在使用OpenNI来记录骨架运动,但我不确定如何从那里开始触发离散动作。

我的问题可能就像姿势检测一样简单,但它也可能像基于时间的运动一样复杂(即,检测他们何时将手移动到圆圈中),具体取决于难度。我见过的用于姿势检测的例子非常特别 - 这是因为通用算法难以做到吗?

4 个答案:

答案 0 :(得分:5)

NITE库(在OpenNI之上)有用于检测滑动和其他手势的类,但我个人在使用C#中的基本OpenNI和NITE库时遇到了麻烦(我一直在运行AccessViolationExceptions)。如果您正在编写托管代码,则XnVNITE.net.dll具有刷卡检测功能。安装NITE后,它会在PrimeSense / NITE文件夹下找到。

如果没有骨架和用户识别,还有ManagedNite.dll库,它是PrimeSense NITE安装附带的冗余库。 ManagedNite.dll还具有手/手势识别功能,但没有骨架/用户检测功能。

否则,您可以按照建议检测自己的基于时间的滑动手势。您应该能够检测到一系列手点是否沿着一条直线行进,具有如下函数:

static bool DetectSwipe(Point3D[] points)
{
    int LineSize = 10; // number of points in the array to look at
    int MinXDelta = 300; // required horizontal distance
    int MaxYDelta = 100; // max mount of vertical variation

    float x1 = points[0].X;
    float y1 = points[0].Y;
    float x2 = points[last].X;
    float y2 = points[last].Y;

    if (Math.Abs(x1 - x2) < MinXDelta)
        return false;

    if (y1 - y2 > MaxYDelta)
        return false;

    for (int i = 1; i < LineSize - 2; i++)
    {
        if (Math.Abs((points[i].Y - y1)) > MaxYDelta)
            return false;

        float result =
            (y1 - y1) * points[i].X +
            (x2 - x1) * points[i].Y +
            (x1 * y2 - x2 * y1);

        if (result > Math.Abs(result))
        {
            return false;
        }
    }
    return true;
}

您可以增强此代码以检测右击与左击。我在上面的示例中也没有包含时间计算 - 您需要查看第一个和最后一个点的时间,并确定滑动是否在一定时间内完成。

答案 1 :(得分:1)

检查一下:http://kinectrecognizer.codeplex.com/

支持3D跟踪和识别微调..也应该易于重用

答案 2 :(得分:0)

Softkinetic看起来很有希望,但SDK还没有免费提供。

答案 3 :(得分:0)

我正在为kinect开发一个独立的骨架检测代码。 http://code42tiger.blogspot.com

我打算免费发布它,但是我还有很长的路要走。我想知道您的要求是否只是手部位置跟踪,您可以自己编写,甚至不使用OpenNI或任何其他库。如果您需要简单的提示,请阅读以下内容。

1)删除背景(在我的博客中解释) 2)Blob检测(选择要跟踪的人,也在博客中解释) 3)手部跟踪(现在,当您在数据中单独使用用户时,您可以通过考虑距离身体最远的点来轻松找到手部。) 4)跟踪手位置以检测手势。 (每隔几帧跟踪手的一些计算将给出运动的几何形状)

这应该有效(如果不是完美的话)75%的时间。除非用户试图找出算法的错误,否则它应该适用于普通用户。