我正在尝试使用Kinect创建一个程序,在那里观察用户并作为程序的输出告诉用户走路的方向。
我的意思是,如果用户向前走,输出应为.. UP
0 <= 8 <= // the user (8) is walking forward (<=) to the camera (0=kinect)
如果用户向后走,输出应为DOWN。 如果用户向左走,则输出应为LEFT。 对于右边也是如此。
直到我拥有的是:
private static KinectSensor kinectSensor;
static void Main(string[] args)
{
kinectSensor = KinectSensor.KinectSensors[0];
kinectSensor.SkeletonStream.Enable();
kinectSensor.Start();
kinectSensor.SkeletonFrameReady += kinectRuntime_SkeletonFrameReady;
while (true) { }
}
private static Skeleton[] data;
static void kinectRuntime_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
{
if (skeletonFrame != null)
{
if ((data == null) || (data.Length != skeletonFrame.SkeletonArrayLength))
data = new Skeleton[skeletonFrame.SkeletonArrayLength];
skeletonFrame.CopySkeletonDataTo(data);
foreach (Skeleton ske in data)
{
if (ske.TrackingState == SkeletonTrackingState.Tracked)
{
var joints = ske.Joints;
foreach (Joint joint in ske.Joints)
{
if (joint.JointType == JointType.HandLeft)
{
Console.WriteLine(joint.Position.X.ToString(".##"));
Console.WriteLine(joint.Position.Y.ToString(".##"));
Console.WriteLine(joint.Position.Z.ToString(".##"));
}
}
}
}
}
}
}
这只是告诉你左手的位置。我对Kinect库知之甚少,所以我需要一些帮助才能做到这一点。
我见过帖子,但我仍然不明白这对我有什么帮助。
答案 0 :(得分:3)
由于所有关节都具有X,Y,Z值,因此检测前进和后退(上下)就像监视关节的Z坐标一样容易。检测左和右就像监视X坐标值一样简单。显然你需要一点缓冲空间,因为很难指望有人专门在每个轴上移动。
Spine
可能是一个很好的监控关节,因为在走路时手会摆动。您需要做的就是比较最后3个或4个骨架框架,看看用户看起来移动的方向,并将其映射到您需要的任何方向。
答案 1 :(得分:1)
要检查某个方向的运动,您需要保留一段时间的关节历史。例如,从最后0.5秒开始的最后16帧。如果你有,你可以分析运动的方向,比较关节的实际位置(例如HipCenter)和历史。通过检查所有3轴,您可以说是用户向右,向左,向前,向后。他是跳跃还是蹲伏。
要创建此类历史记录,您可以创建一些结构列表。结构需要有一个时间戳。使用时间戳,您可以删除早于0.5秒的条目,这样您的列表就不会增长太多。在每个框架中,您将列表放入循环中,并通过比较关节位置
将每个元素与实际位置进行比较