0

私は動きの速度を計算するために何日も立ち往生しているので、私の問題をもっと説明しようとします.

kinect SDK と VS c# で落下を検出できるアプローチを適用する必要があります。

このアプローチは、スケルトン ジョイントの座標から構築された 3Box の 3 次元を入力として受け取ります。

これらの寸法は次のとおりです。

W = |xMin - xMax|;

H = |yMin - yMax|;

D = |zMin - zMax|;

xMin、xMax、yMin、yMax、zMin、zMax を使用して、追跡されたすべてのジョイントの座標の最小値と最大値を指定します。

この時点では、これは問題ではありません..私はすでにこれらすべての値を計算しました:

 List<Joint> JointList = new List<Joint>();
    List<double> JCx = new List<double>();
    List<double> JCy = new List<double>();
    List<double> JCz = new List<double>();

// 座標の最小値と最大値を kinect の視野として定義する

    private double xMin = 2.2;
    private double xMax = -2.2;
    private int framecounter = 0;
    private double yMin = 1.6;
    private double yMax = -1.6;
    private double zMin = 4;
    private double zMax = 0;

Skeleton first = GetFirstSkeleton(allFramesReadyEventArgs);


        if (first == null) // if no skeleton
        {
            txtP.Text = "No One"; 
            return;
        }

        else
        {
            txtP.Text = "Yes";
            skeletonDetected = true;


            /// define all joints

            Joint Head = first.Joints[JointType.Head];
            JointList.Add(Head);
            Joint SC = first.Joints[JointType.ShoulderCenter];
            JointList.Add(SC);
            Joint SL = first.Joints[JointType.ShoulderLeft];
            JointList.Add(SL);
            Joint SR = first.Joints[JointType.ShoulderRight];
            JointList.Add(SR);
            Joint EL = first.Joints[JointType.ElbowLeft];
            JointList.Add(EL);
            Joint ER = first.Joints[JointType.ElbowRight];
            JointList.Add(ER);
            Joint WL = first.Joints[JointType.WristLeft];
            JointList.Add(WL);
            Joint WR = first.Joints[JointType.WristRight];
            JointList.Add(WR);
            Joint HandL = first.Joints[JointType.HandLeft];
            JointList.Add(HandL);
            Joint HandR = first.Joints[JointType.HandRight];
            JointList.Add(HandR);
            Joint Spine = first.Joints[JointType.Spine];
            JointList.Add(Spine);
            Joint HipC = first.Joints[JointType.HipCenter];
            JointList.Add(HipC);
            Joint HipL = first.Joints[JointType.HipLeft];
            JointList.Add(HipL);
            Joint HipR = first.Joints[JointType.HipRight];
            JointList.Add(HipR);
            Joint KL = first.Joints[JointType.KneeLeft];
            JointList.Add(KL);
            Joint KR = first.Joints[JointType.KneeRight];
            JointList.Add(KR);
            Joint AnkL = first.Joints[JointType.AnkleLeft];
            JointList.Add(AnkL);
            Joint AnkR = first.Joints[JointType.AnkleRight];
            JointList.Add(AnkR);
            Joint FL = first.Joints[JointType.FootLeft];
            JointList.Add(FL);
            Joint FR = first.Joints[JointType.FootRight];
            JointList.Add(FR);

// 各関節の x、y、z 座標を計算し、// それを 3 つの異なるリストに入れます

            foreach (Joint j in JointList)
            {
                if (j.TrackingState == JointTrackingState.Tracked)

                jx = j.Position.X;
                JCx.Add(jx);
                jy = j.Position.Y;
                JCy.Add(jy);
                jz = j.Position.Z;              
                JCz.Add(jz);

                foreach (double f in JCx)
                {

                    if (f < xMin)
                        xMin = f;
                    else if (f > xMax)
                        xMax = f;
                }

                foreach (double f in JCy)
                {


                    if (f < yMin)
                        yMin = f;
                    else if (f > yMax)
                        yMax = f;
                }

                foreach (double f in JCz)
                {

                    if (f < zMin)
                        zMin = f;
                    else if (f > zMax)
                        zMax = f;

                }


            }
            txtminx.Text = xMin.ToString();
            txtmaxx.Text = xMax.ToString();
            txtminy.Text = yMin.ToString();
            txtmaxy.Text = yMax.ToString();
            txtminz.Text = zMin.ToString();
            txtmaxz.Text = zMax.ToString();

//Box の 3 次元と対角線の WD を計算する

            double W = System.Math.Abs(xMin - xMax);
            double H = System.Math.Abs(yMin - yMax);
            double D = System.Math.Abs(zMin - zMax);
            double WD = System.Math.Sqrt(Math.Pow(W0, 2) + Math.Pow(D0, 2));

問題は、ボックスの寸法 vH および vWD の速度を計算する必要がある場合です。

vH = (Hi - H0) /(Ti-T0);

vWD = (WDi-WD0) /(Ti-T0);

DateTime.UtcNow と Stopwatch を使用して、費やした時間を計算しようとしました

   DateTime T0 = DateTime.UtcNow;

Stopwatch _stopwatch = Stopwatch.StartNew();
DateTime Ti = DateTime.UtcNow;

しかし、最初は H 値を取得する方法がわかりません。また、この方法で実際の結果が得られるかどうかもわかりません。

誰でも私を助けることができますか?

前もって感謝します

4

1 に答える 1

0

私はアプリケーションで同様のことをしました。アプリケーションの開始時にストップウォッチを開始しました。

System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
int msNow;
int msPast;
int dif;
TimeSpan currentTime;
TimeSpan lastTime = new TimeSpan(0);
public GaitAnalyzer()
{
        stopWatch.Start();
}

次に、次のようなことをする必要があります。

currentTime = stopWatch.Elapsed;
msNow = currentTime.Seconds * 1000 + currentTime.Milliseconds;
if(lastTime.Ticks != 0)
{
     msPast = lastTime.Seconds * 1000 + lastTime.Milliseconds;
     dif = msNow - msPast;    
}
lastTime = currentTime;
于 2013-07-29T14:49:21.640 に答える