2

ユーザーの回転を追跡できる WPF アプリケーションを実装しています。基本的なアイデアは、kinect を一定の場所に配置することです。ユーザーは kinect の前に来て、360 度回転できます。ユーザーが回転した度数を追跡したい。私はそれを追跡するために次の方法を使用しました。しかし、この機能は正確ではないようで、ユーザーが 0 度を向いているときは 180 と表示され、マイナスの値も表示されます。

public static double GetShoulderRotation(this Skeleton skeleton)
    {
        Joint leftShoulder = skeleton.Joints[JointType.ShoulderLeft];
        Joint rightShoulder = skeleton.Joints[JointType.ShoulderRight];
        if (leftShoulder.TrackingState == JointTrackingState.NotTracked ||
            rightShoulder.TrackingState == JointTrackingState.NotTracked)
        {
            return Double.NaN;
        }
        else
        {
            return (Math.Atan2(
                rightShoulder.Position.Z - leftShoulder.Position.Z,
                leftShoulder.Position.X - rightShoulder.Position.X)*180.0/Math.PI);
        }
    }

誰でもこれに対する解決策を教えてください。

4

3 に答える 3

1

ヒップセンターと脊椎の間の骨の回転を使用することをお勧めします。人がKinectの正面に立っている場合、Hipcenter.Z-Spine.Zは正です。人が横向きに立って左を向いている場合、Hipcenter.X-Spine.Xはマイナスの値です。X値とZ値を使用すると、回転角を簡単に計算できます。正弦波の肩関節は、Kinectから体の他の部分によってブロックされる可能性があります。脊椎にヒップセンターの骨を選択しました。これは、体の回転を追跡するのに効果的でした。

于 2012-11-19T18:12:09.903 に答える
0

度を計算する代わりに深さを使用してみてください。まず、右肩と左肩の間の距離 (X 軸) を検出します。次に、この距離と角度の比率を作成します。距離 (つまり、右肩と左肩の間の距離) が最大で正の場合、角度は 0 です。距離が最大で負の場合、角度は 180 です。距離が最大/2 で正の場合、角度は 45 です。

于 2012-07-06T12:36:00.337 に答える
0

それは古い質問だと思いますが、最近同じ問題に苦しんでいます。2 つの関節間の回転角度を追跡できる関数を作成しました。左右の腰を試してみましたが、うまくいきました。他の誰かの役に立ちますように。

1 つのことは、両方の方法で 70 度未満の回転角度でうまく機能することです。角度が大きくなると、適切に追跡するのが難しくなります。

これが私の解決策です。

    protected double TrackJointsRotation(KinectSensor sensor, Joint joint1, Joint joint2)
    {
        if (joint1.TrackingState == JointTrackingState.NotTracked
            || joint2.TrackingState == JointTrackingState.NotTracked)
            return double.NaN;

        var rightHip = sensor.CoordinateMapper.MapSkeletonPointToDepthPoint(joint1.Position, sensor.DepthStream.Format);
        var leftHip = sensor.CoordinateMapper.MapSkeletonPointToDepthPoint(joint2.Position, sensor.DepthStream.Format);

        return (Math.Atan(((double)rightHip.Depth - leftHip.Depth) / ((double)leftHip.X - rightHip.X)) * 180.0 / Math.PI);
    }
于 2014-12-17T22:55:28.423 に答える