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/