Kinect有哪些手势识别库(如果有)?现在,我正在使用OpenNI来记录骨骼运动,但是不确定如何从中触发离散 Action 。

我的问题可能与姿势检测一样简单,但也可能与基于时间的移动(即检测他们何时将手沿一圈移动)进行检测一样复杂,具体取决于其难度。我见过的姿势检测示例非常特殊-这是因为通用算法很难做到正确吗?

最佳答案

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;
}

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

关于gesture-recognition - 基于骨骼运动的Kinect 3D手势识别-存在哪些库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5234094/

10-11 08:07