0

私は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の床からの距離を計算し、情報を組み合わせます。

私たちは私を助けることができますか????

よろしくお願いします

4

1 に答える 1

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);
            }
        }   
    }
}
于 2014-03-15T06:11:31.770 に答える