使用 kinect 和 Visual Studio 跟踪速度



我需要跟踪踢球的速度。我编写了这段代码,但是当我运行程序时,即使我移动右脚的速度非常快,速度也不会改变太多。
怎么了?有没有不同的方法?

if (bandera == true)
{
X1 = skeleton.Joints[JointType.FootRight].Position.X;
Y1 = skeleton.Joints[JointType.FootRight].Position.Y;
Z1 = skeleton.Joints[JointType.FootRight].Position.Z;
}
if (bandera == false)
{  
X2 = skeleton.Joints[JointType.FootRight].Position.X;
Y2 = skeleton.Joints[JointType.FootRight].Position.Y;
Z2 = skeleton.Joints[JointType.FootRight].Position.Z;
}
bandera = !bandera;
float d= (((X1 - X2) * (X1 - X2)) + ((Y1 - Y2) * (Y1 - Y2)) + ((Z1 - Z2 * (Z1 - Z2))));
double distance = System.Math.Sqrt(d);
double speed= 30 * distance;
Console.WriteLine(speed);

如您所知:速度=距离/时间我知道每秒有 30 FPS,所以时间 = 1/30所以速度等于距离除以(1/30)等于30*距离

嗯...因为您使用相同的点...所以当你减去时,它都是0...

X1 = skeleton.Joints[JointType.FootRight].Position.X;
...
X2 = skeleton.Joints[JointType.FootRight].Position.X;
...

同样的观点,所以x1=x2x1-x2=0,一切都从那里变成梨形......


根据您的更新:

  1. 我希望这是一个循环,否则,你的旗帜(班德拉)不会做太多事情。我希望你也意识到,第一次通过循环时,你的一些XY不会被初始化(因为它只会经历其中一种情况)。

  2. 现在,d=t*s,所以你的距离计算是完全正确的。

如果您在初始化变量和计算后处理一些调试输出,您会得到什么?

你搞砸了距离公式。放置括号时要格外小心。它应该是这样的

float d = (X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2) + (Z1 - Z2) * (Z1 - Z2);

也没有必要将布尔值与true进行比较。您还可以将距离计算移出到其自己的方法中,以使事情更清晰,并避免需要时间才能找到的误拍。我建议这样:

double distance(Joint a, Joint b)
{
    float d2 = (b.X - a.X) * (b.X - a.X) + (b.Y - a.Y) * (b.Y - a.Y) + (b.Z - a.Z) * (b.Z - a.Z);
    return System.Math.Sqrt(d2)
}
...
if (bandera)
{
    a = skeleton.Joints[JointType.FootRight];
}
else
{  
    b = skeleton.Joints[JointType.FootRight];
}
bandera = !bandera;
double speed = 30 * distance(a, b);
Console.WriteLine(speed);

您的速度计算非常容易波动,因此平均超过 10 帧也可能有所帮助。

我在您的代码中看到的唯一错误是您在距离计算中缺少括号:(Z1 - Z2) 必须在括号之间,否则操作顺序不正确。其他一切都应该正常工作。正如vidstige所说,当踢球进行时,速度会有所不同,所以为了你所说的目的,我建议简单地保持最大的价值。

萨卢多斯!!

最新更新