Ste*_*len 5 gesture-recognition 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;
}
Run Code Online (Sandbox Code Playgroud)
您可以增强此代码以检测右击和左击.我在上面的示例中也没有包括时间计算 - 您需要查看第一个和最后一个点的时间,并确定滑动是否在一定时间内完成.
| 归档时间: |
|
| 查看次数: |
13546 次 |
| 最近记录: |