В библиотеке NITE (поверх OpenNI) есть классы для обнаружения смахивания и других жестов, но лично у меня были проблемы с одновременным использованием базовых библиотек OpenNI и NITE в C # (я продолжаю работать с AccessViolationExceptions).Если вы пишете управляемый код, XnVNITE.net.dll - это то, что имеет обнаружение пролистывания.Он находится в папке PrimeSense / NITE после установки 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;
}
Вы можете улучшить этот код, чтобы обнаруживать движение вправо или влево.Я также не включил вычисление времени в моем примере выше - вам нужно посмотреть на время первой и последней точки и определить, было ли проведено сканирование в течение определенного периода времени.