C# 如何检测用户行走的方向?
我正在尝试使用Kinect创建一个程序,在其中观察用户,并作为程序的输出告诉用户行走的方向 我的意思是,如果用户向前走,输出应该是。。向上C# 如何检测用户行走的方向?,c#,console-application,kinect,openkinect,C#,Console Application,Kinect,Openkinect,我正在尝试使用Kinect创建一个程序,在其中观察用户,并作为程序的输出告诉用户行走的方向 我的意思是,如果用户向前走,输出应该是。。向上 0 <= 8 <= // the user (8) is walking forward (<=) to the camera (0=kinect) 这只是告诉你左手的位置。我对Kinect库了解不多,所以我需要一些帮助来完成这项工作 我看过帖子,但我仍然不明白这对我有什么帮助。因为所有关节都有一个X、Y、Z值,检
0 <= 8 <= // the user (8) is walking forward (<=) to the camera (0=kinect)
这只是告诉你左手的位置。我对Kinect库了解不多,所以我需要一些帮助来完成这项工作
我看过帖子,但我仍然不明白这对我有什么帮助。因为所有关节都有一个X、Y、Z值,检测向前和向后(上下)就像监测关节的Z坐标一样简单。检测左侧和右侧与监视X坐标值一样简单。很明显,您需要一点缓冲空间,因为很难期望有人在每个轴上单独移动
脊椎
可能是一个很好的监控关节,因为走路时双手会摆动。您需要做的只是比较最后3或4个骨架帧,以查看用户似乎正在移动的方向,并将其映射到您需要的任何方向。要检查某个方向的移动,您需要保留一段时间的关节历史记录。例如,最后0,5秒的最后16帧。若你们有,你们可以分析运动的方向,比较关节的实际位置(例如髋部中心)和历史。通过检查所有3个轴,您可以说用户正在向右、向左、向前、向后移动。他是在跳还是蹲
要创建这样的历史记录,可以创建一些结构的列表。结构需要有一个时间戳。使用时间戳,您可以删除超过0.5秒的条目,这样您的列表不会增长太多。在每一帧中,你将列表放入循环中,通过比较关节位置,将每个元素与实际位置进行比较七个闭合大括号的列表肯定很尴尬;可能会将一些“guard”
if
语句转换为早期返回,而不是在不做任何操作的情况下从函数末尾掉下来。很抱歉打扰您,您能帮我编写一点代码吗?
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(".##"));
}
}
}
}
}
}
}