我已经用kinect传感器编写了一个用于检测下降的算法。现在我详细说明我的联合负责人。我在这个视图中计算了与地板的距离:
public void verificaCaduta(SkeletonFrame skeletonFrame, KinectDati_Joints joints)
{
if (skeletonFrame != null && joints != null)
{
float A = skeletonFrame.FloorClipPlane.Item1;
float B = skeletonFrame.FloorClipPlane.Item2;
float C = skeletonFrame.FloorClipPlane.Item3;
float D = skeletonFrame.FloorClipPlane.Item4;
//dovrei calcolare la distanza dal pavimento
//joint head
float addendo1 = A * joints.head.Position.X;
float addendo2 = B * joints.head.Position.Y;
float addendo3 = C * joints.head.Position.Z;
float addendo1_d = A * A;
float addendo2_d = B * B;
float addendo3_d = C * C;
float numeratore = addendo1 + addendo2 + addendo3 + D;
float denominatore = addendo1_d + addendo2_d + addendo3_d;
float distanza = numeratore / (float)System.Math.Sqrt(denominatore);
// Console.WriteLine("probabile caduta " + distanza);
if (distanza <= 0.60)
{
Console.WriteLine("fall detection ?");
}
}
}
如果离地面的距离在0.6之前,则i检测下降。但现在我会使算法复杂化。我会从地板上计算所有JOINT的distanze并组合信息。
我们可以帮助我吗????
关心所有
答案 0 :(得分:0)
将距离计算代码提取到方法“DistanceFromJointToFloor”中,然后遍历调用该新方法的每个关节。将距离结果与您的阈值0.6f进行比较:
public float DistanceToFloor(SkeletonFrame skeletonFrame, Joints joint)
{
float A = skeletonFrame.FloorClipPlane.Item1;
float B = skeletonFrame.FloorClipPlane.Item2;
float C = skeletonFrame.FloorClipPlane.Item3;
float D = skeletonFrame.FloorClipPlane.Item4;
//dovrei calcolare la distanza dal pavimento
//joint head
float addendo1 = A * joints.head.Position.X;
float addendo2 = B * joints.head.Position.Y;
float addendo3 = C * joints.head.Position.Z;
float addendo1_d = A * A;
float addendo2_d = B * B;
float addendo3_d = C * C;
float numeratore = addendo1 + addendo2 + addendo3 + D;
float denominatore = addendo1_d + addendo2_d + addendo3_d;
float distanza = numeratore / (float)System.Math.Sqrt(denominatore);
return distanza;
}
然后你修改过的方法看起来像这样(注意:我不知道KinectDati_Joints是什么类型,但我认为它是一个可以从中提取关节的集合):
public void verificaCaduta(SkeletonFrame skeletonFrame, KinectDati_Joints joints)
{
if (skeletonFrame != null && joints != null)
{
foreach(Joint joint in joints)
{
float distanza = DistanceToFloor(skeletonFrame, joint);
if (distanza <= 0.60)
{
Console.WriteLine("fall detection ?");
Console.WriteLine("with joint: " + joint);
Console.WriteLine("distance:" + distanza);
}
}
}
}