Kinect 有哪些手势识别库(如果有)?现在我正在使用 OpenNI 来记录骨骼运动,但不知道如何从那开始触发离散动作。
我的问题可能与姿势检测一样简单,但也可能与基于时间的运动一样复杂(即检测他们何时将手转圈),具体取决于这有多困难。我看到的姿势检测示例非常特别 - 这是因为通用算法很难正确执行吗?
Kinect 有哪些手势识别库(如果有)?现在我正在使用 OpenNI 来记录骨骼运动,但不知道如何从那开始触发离散动作。
我的问题可能与姿势检测一样简单,但也可能与基于时间的运动一样复杂(即检测他们何时将手转圈),具体取决于这有多困难。我看到的姿势检测示例非常特别 - 这是因为通用算法很难正确执行吗?
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;
}
您可以增强此代码以检测左右滑动。我在上面的示例中也没有包括时间计算 - 您需要查看第一个点和最后一个点的时间,并确定滑动是否在一定时间内完成。
看看这个:http: //kinectrecognizer.codeplex.com/
支持 3D 跟踪和识别微调.. 也应该易于重用
Softkinetic看起来很有希望,但 SDK 尚未免费提供。
我正在为 kinect 开发一个独立的骨架检测代码。http://code42tiger.blogspot.com
我打算免费发布它,但距离完美还有很长的路要走。我想知道您的要求是否只是手部位置跟踪,您甚至可以自己编写而不使用 OpenNI 或任何其他库。如果您需要一个简单的提示,请阅读下文。
1) 背景去除(在我的博客中解释) 2) Blob 检测(选择要跟踪的人,也在博客中解释) 3) 手部跟踪(现在当数据中只有用户时,您可以轻松找到找到手部通过考虑离身体最远的点。) 4)跟踪手的位置以检测手势。(每隔几帧跟踪手的一些计算将为您提供运动的几何形状)
这应该在 75% 的时间内有效(如果不完美的话)。除非用户试图找出算法的错误,否则它应该适用于普通用户。