5

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

我的问题可能与姿势检测一样简单,但也可能与基于时间的运动一样复杂(即检测他们何时将手转圈),具体取决于这有多困难。我看到的姿势检测示例非常特别 - 这是因为通用算法很难正确执行吗?

4

4 回答 4

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

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

于 2011-03-25T20:59:34.887 回答
1

看看这个:http: //kinectrecognizer.codeplex.com/

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

于 2011-08-09T07:33:34.147 回答
0

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

于 2011-03-09T18:34:11.277 回答
0

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

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

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

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

于 2011-04-05T07:20:41.883 回答