-3

私は Kinect v2 を使用して右手のジェスチャー検出に取り組んでおり、使用できる良いサンプルを手に入れましたが、エラーが発生したときにコードの変換に行き詰まりました。 . has some invalid arguments" がいくつかの類似したコード行に表示されます。このエラーに関する以前の問題を確認しましたが、この特定の問題の解決策が見つかりませんでした。いくつかの助けをいただければ幸いです。

// Gesture detection

    public enum HandPosition { Unknown, Up, Center, Down, Left, Right, Backwards, Forwards }

    public class HandPositionChangedArgs
    {
        public HandPosition Position { get; set; }
    }

    public delegate void HandPositionChangedDelegate(object sender, HandPositionChangedArgs args);

    public static class GestureDetection
    {
        public static void FrameReady(Microsoft.Kinect.Body skeleton)
        {
            ProcessRightHand(skeleton);
        }

        // Right Hand
        private static Dictionary<int, HandPosition> rightHandUpDownDictionary = new Dictionary<int, HandPosition>();
        private static Dictionary<int, HandPosition> rightHandLeftRightDictionary = new Dictionary<int, HandPosition>();
        private static Dictionary<int, HandPosition> rightHandBackForwardsDictionary = new Dictionary<int, HandPosition>();

        public static event HandPositionChangedDelegate RightHandUpDownChanged;
        public static event HandPositionChangedDelegate RightHandLeftRightChanged;
        public static event HandPositionChangedDelegate RightHandBackForwardsChanged;

        public static void ProcessRightHand(Microsoft.Kinect.Body skeleton)
        {
            Joint rightHand = skeleton.Joints[Microsoft.Kinect.JointType.HandRight];
            Joint rightShoulder = skeleton.Joints[Microsoft.Kinect.JointType.ShoulderRight];

            CameraSpacePoint rightHandPoint = rightHand.Position;
            CameraSpacePoint rightShoulderPoint = rightShoulder.Position;

            HandPosition previousRightHandUpDownPosition = (rightHandUpDownDictionary.ContainsKey(skeleton.TrackingId)) ? rightHandUpDownDictionary[skeleton.TrackingId] : HandPosition.Unknown; // Here's the error
            HandPosition newRightHandUpDownPosition = HandPosition.Unknown;

            HandPosition previousRightHandLeftRightPosition = (rightHandLeftRightDictionary.ContainsKey(skeleton.TrackingId)) ? rightHandLeftRightDictionary[skeleton.TrackingId] : HandPosition.Unknown; // Here's the error
            HandPosition newRightHandLeftRightPosition = HandPosition.Unknown;

            HandPosition previousRightHandBackForwardsPosition = (rightHandBackForwardsDictionary.ContainsKey(skeleton.TrackingId)) ? rightHandBackForwardsDictionary[skeleton.TrackingId] : HandPosition.Unknown;// Here's the error
            HandPosition newRightHandBackForwardsPosition = HandPosition.Unknown;

            if ((rightHand.TrackingState == TrackingState.NotTracked) || (rightShoulder.TrackingState == TrackingState.NotTracked)) // From JointTrackingState to TrackingState?
            {
                newRightHandUpDownPosition = HandPosition.Unknown;
                newRightHandLeftRightPosition = HandPosition.Unknown;
                newRightHandBackForwardsPosition = HandPosition.Unknown;
            }
            else
            {
                // Up/Down
                if (rightHandPoint.Y - rightShoulderPoint.Y > 0.2)
                {
                    newRightHandUpDownPosition = HandPosition.Up;
                }
                else if (Math.Abs(rightHandPoint.Y - rightShoulderPoint.Y) > 0.2)
                {
                    newRightHandUpDownPosition = HandPosition.Down;
                }
                else
                {
                    newRightHandUpDownPosition = HandPosition.Center;
                }

                // Left/Right
                if (rightHandPoint.X - rightShoulderPoint.X > 0.2)
                {
                    newRightHandLeftRightPosition = HandPosition.Right;
                }
                else if (Math.Abs(rightHandPoint.X - rightShoulderPoint.X) > 0.2)
                {
                    newRightHandLeftRightPosition = HandPosition.Left;
                }
                else
                {
                    newRightHandLeftRightPosition = HandPosition.Center;
                }

                // Backwards/Forwards
                if (rightShoulderPoint.Z - rightHandPoint.Z > 0.5)
                {
                    newRightHandBackForwardsPosition = HandPosition.Forwards;
                }
                else if (rightShoulderPoint.Z - rightHandPoint.Z < 0.25)
                {
                    newRightHandBackForwardsPosition = HandPosition.Backwards;
                }
                else
                {
                    newRightHandBackForwardsPosition = HandPosition.Center;
                }
            }

            if (previousRightHandUpDownPosition != newRightHandUpDownPosition)
            {
                rightHandUpDownDictionary[skeleton.TrackingId] = newRightHandUpDownPosition; // Here's the error
                if (RightHandUpDownChanged != null)
                {
                    RightHandUpDownChanged(skeleton, new HandPositionChangedArgs() { Position = newRightHandUpDownPosition });
                }
            }

            if (previousRightHandLeftRightPosition != newRightHandLeftRightPosition)
            {
                rightHandLeftRightDictionary[skeleton.TrackingId] = newRightHandLeftRightPosition; // Here's the error
                if (RightHandLeftRightChanged != null)
                {
                    RightHandLeftRightChanged(skeleton, new HandPositionChangedArgs() { Position = newRightHandLeftRightPosition });
                }
            }

            if (previousRightHandBackForwardsPosition != newRightHandBackForwardsPosition)
            {
                rightHandBackForwardsDictionary[skeleton.TrackingId] = newRightHandBackForwardsPosition; // Here's the error
                if (RightHandBackForwardsChanged != null)
                {
                    RightHandBackForwardsChanged(skeleton, new HandPositionChangedArgs() { Position = newRightHandBackForwardsPosition });
                }
            }
        }
    }
4

1 に答える 1

0

さまざまな辞書を として定義しましDictionary<int, HandPosition>たが、コード内では を使用しskeleton.TrackingIdて辞書のキーを参照しています。MSDN
よると、. Body.TrackingIdulong

辞書を再定義するか、変数にDictionary<ulong, HandPosition>変換して使用する必要があります。skeleton.TrackingIdInt

于 2015-04-14T15:30:56.867 に答える