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

Ste*_*len 5 gesture-recognition kinect openni

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

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

kin*_*ohm 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;
}
Run Code Online (Sandbox Code Playgroud)

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