Распознавание жестов с использованием устройств OpenNI, NiTE, C#, Xtion Pro Live
В моем приложении, используя ввод с устройства ASUS Xtion Pro Live, я хотел бы использовать NiTE для распознавания жестов, потому что мой собственный код распознавания жестов, основанный на возможности скелета OpenNI, неуклюж и не совсем надежен.
Я использую OpenNI.net.dll v1.5.2.23 и XnVNITE.net.dll v1.5.2.21, это то, что пришло на компакт-диск с устройством. Кажется, они не сделали.NET оболочки для v2 в любом случае.
Просто, чтобы начать, я написал некоторый код на основе примеров NiHandViewer/HandViewer.java, но он ничего не делает, никакие события не запускаются, и я не смог найти никаких полезных примеров NiTE C#, чтобы указать мне в правильном направлении.
Что не так с кодом ниже?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenNI;
using NITE;
using System.Threading.Tasks;
namespace NiTEPlayground
{
static class Point3DExtensions
{
public static string ToTripletString(this Point3D point3d)
{
return String.Format("({0}, {1}, {2})", point3d.X, point3d.Y, point3d.Z);
}
}
class Program
{
static Context context;
static GestureGenerator generator;
static HandsGenerator handsGen;
static void Main(string[] args)
{
ScriptNode scriptNode;
context = Context.CreateFromXmlFile("SamplesConfig.xml", out scriptNode);
generator = new GestureGenerator(context);
generator.AddGesture("Wave");
generator.AddGesture("Click");
generator.GestureRecognized += new EventHandler<GestureRecognizedEventArgs>(generator_GestureRecognized);
generator.GestureProgress += new EventHandler<GestureProgressEventArgs>(generator_GestureProgress);
handsGen = new HandsGenerator(context);
handsGen.HandCreate += new EventHandler<HandCreateEventArgs>(handsGen_HandCreate);
handsGen.HandUpdate += new EventHandler<HandUpdateEventArgs>(handsGen_HandUpdate);
handsGen.HandDestroy += new EventHandler<HandDestroyEventArgs>(handsGen_HandDestroy);
context.StartGeneratingAll();
Task.Factory.StartNew(() =>
{
while (true)
{
context.WaitAnyUpdateAll();
}
});
Console.ReadKey();
}
static void generator_GestureProgress(object sender, GestureProgressEventArgs e)
{
Console.WriteLine("Gesture Progress: {0}; {1}; {2}", e.Gesture, e.Position.ToTripletString(), e.Progress);
}
static void handsGen_HandDestroy(object sender, HandDestroyEventArgs e)
{
Console.WriteLine("Hand Create: {0}, {1}", e.UserID, e.Time);
}
static void handsGen_HandUpdate(object sender, HandUpdateEventArgs e)
{
Console.WriteLine("Hand Update: {0}, {1}, {2}", e.UserID, e.Time, e.Position.ToTripletString());
}
static void handsGen_HandCreate(object sender, HandCreateEventArgs e)
{
Console.WriteLine("Hand Create: {0}, {1}, {2}", e.UserID, e.Time, e.Position.ToTripletString());
}
static void generator_GestureRecognized(object sender, GestureRecognizedEventArgs e)
{
Console.WriteLine("Gesture:{0}; Identified:{1}; End:{2}", e.Gesture, e.IdentifiedPosition.ToTripletString(), e.EndPosition.ToTripletString());
}
}
}
1 ответ
Ну, я попробовал ваш код, и он работает для меня.
Чтобы включить ручное отслеживание, необходимо запустить отслеживание:
Просто замените:
static void generator_GestureRecognized(object sender, GestureRecognizedEventArgs e)
{
Console.WriteLine("Gesture:{0}; Identified:{1}; End:{2}", e.Gesture, e.IdentifiedPosition.ToTripletString(), e.EndPosition.ToTripletString());
}
static void generator_GestureRecognized(object sender, GestureRecognizedEventArgs e)
{
handsGen.StartTracking(e.EndPosition);
Console.WriteLine("Gesture:{0}; Identified:{1}; End:{2}", e.Gesture, e.IdentifiedPosition.ToTripletString(), e.EndPosition.ToTripletString());
}