基于骨架运动的Kinect三维手势识别 - 有哪些库可用?

5
有没有适用于Kinect的手势识别库?目前我正在使用OpenNI记录骨架运动,但不确定如何从中触发离散动作。
我的问题可能只是姿势检测,但也可能像时间基础运动一样复杂(即检测他们何时在画圆形)。我看到的姿势检测示例非常临时 - 这是因为通用算法很难做对吗?
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;
}

你可以改进这段代码,以便检测右滑和左滑。上面的示例中也没有包含时间计算 - 你需要查看第一个和最后一个点的时间,并确定在一定时间内是否完成了滑动。


1

0

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

我计划免费发布它,但是我还有很长的路要走才能完美地完成它。我想知道如果您只需要手部位置跟踪,您甚至可以不使用OpenNI或任何其他库来编写它。如果您需要简单的提示,请阅读以下内容。

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

这应该可以工作(如果不完美)75%的时间。除非用户试图找到算法的错误,否则它应该适用于普通用户。


0

Softkinetic 看起来很有前途,但是 SDK 目前还不是免费提供的。


尽管有这个新闻发布:http://www.softkinetic.net/press-release.php?id=121&sid=122&pressid=225 - Steve Vermeulen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接