NITE ライブラリ (OpenNI の上) には、スワイプやその他のジェスチャを検出するためのクラスがありますが、個人的には、C# でベース OpenNI ライブラリと NITE ライブラリの両方を使用するのに問題がありました (AccessViolationExceptions が発生し続けます)。マネージ コードを作成している場合、XnVNITE.net.dll にスワイプ検出機能があります。NITE をインストールすると、PrimeSense/NITE フォルダーの下にあります。
スケルトンとユーザー認識なしで実行できる場合は、PrimeSense NITE インストールに同梱されている冗長ライブラリである ManagedNite.dll ライブラリもあります。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;
}
このコードを拡張して、右スワイプと左スワイプを検出できます。また、上記の例では時間の計算も含めていません。最初と最後のポイントの時間を見て、スワイプが一定時間内に完了したかどうかを判断する必要があります。