0

クリック イベントで SkeletonFrames を利用できるようにします。とにかくそれを可能にすることはありますか?

スケルトンの関節に画像を配置する Kinect を作成する予定でした。これが私のコーディングです。

private void button1_Click(object sender, RoutedEventArgs e)
{
    foreach (SkeletonData data in e.SkeletonFrame.Skeletons)
    {
        foreach (Joint joint in data.Joints)
        {
            if (joint.Position.W < 0.6f) return;
            switch (joint.ID)
            {
                case JointID.Head:
                    var heanp = getDisplayPosition(joint);

                    Canvas.SetLeft(imgHead, heanp.X);
                    Canvas.SetTop(imgHead, heanp.Y);
                    break;
            }
        }
    }
}

間違いがある場合は、私を修正してください。

4

1 に答える 1

1

SkeletonFrameReadyイベントをキャプチャし、最後にキャプチャされたスケルトンをグローバル変数に保存できます。グローバル変数には、ボタンクリックイベントからアクセスできます。

例えば:

private Skeleton[] skeletons = new Skeleton[0];

private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
    Skeleton[] skeletons = new Skeleton[0];

    using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
    {
        if (skeletonFrame != null)
        {
            skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
            skeletonFrame.CopySkeletonDataTo(skeletons);
        }
    }
}

これで、最後のSkeletonFrameReadyイベントの配列(スケルトン)ができました。

以下のコメントに基づいて、SDKのv1.6にアップグレードし、Microsoftが提供する例を実行する必要があります。彼らはあなたがあなたの直接のプロジェクトに望んでいることを正確に行わないかもしれませんが、彼らはあなたにMicrosoft Kinect for Windowsでの作業の基本的な基礎を教え、あなたセンサーでの作業方法の理解を与えます。

差し迫った状況で最も見たい例は、SkeletonBasics-WPFの例です。これは、スケルトンを追跡し、そこからデータをプルする方法を示します。また、追跡されたポイント上およびその間でアイテムを描画する方法も正確に示します。

あなたの状況にとって最も関連性のある部分はDrawBonesAndJoints関数です:

private void DrawBonesAndJoints(Skeleton skeleton, DrawingContext drawingContext)
{
    // Render Torso
    this.DrawBone(skeleton, drawingContext, JointType.Head, JointType.ShoulderCenter);
    this.DrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.ShoulderLeft);
    this.DrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.ShoulderRight);
    this.DrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.Spine);
    this.DrawBone(skeleton, drawingContext, JointType.Spine, JointType.HipCenter);
    this.DrawBone(skeleton, drawingContext, JointType.HipCenter, JointType.HipLeft);
    this.DrawBone(skeleton, drawingContext, JointType.HipCenter, JointType.HipRight);

    // Left Arm
    this.DrawBone(skeleton, drawingContext, JointType.ShoulderLeft, JointType.ElbowLeft);
    this.DrawBone(skeleton, drawingContext, JointType.ElbowLeft, JointType.WristLeft);
    this.DrawBone(skeleton, drawingContext, JointType.WristLeft, JointType.HandLeft);

    // Right Arm
    this.DrawBone(skeleton, drawingContext, JointType.ShoulderRight, JointType.ElbowRight);
    this.DrawBone(skeleton, drawingContext, JointType.ElbowRight, JointType.WristRight);
    this.DrawBone(skeleton, drawingContext, JointType.WristRight, JointType.HandRight);

    // Left Leg
    this.DrawBone(skeleton, drawingContext, JointType.HipLeft, JointType.KneeLeft);
    this.DrawBone(skeleton, drawingContext, JointType.KneeLeft, JointType.AnkleLeft);
    this.DrawBone(skeleton, drawingContext, JointType.AnkleLeft, JointType.FootLeft);

    // Right Leg
    this.DrawBone(skeleton, drawingContext, JointType.HipRight, JointType.KneeRight);
    this.DrawBone(skeleton, drawingContext, JointType.KneeRight, JointType.AnkleRight);
    this.DrawBone(skeleton, drawingContext, JointType.AnkleRight, JointType.FootRight);

    // Render Joints
    foreach (Joint joint in skeleton.Joints)
    {
        Brush drawBrush = null;

        if (joint.TrackingState == JointTrackingState.Tracked)
        {
            drawBrush = this.trackedJointBrush;                    
        }
        else if (joint.TrackingState == JointTrackingState.Inferred)
        {
            drawBrush = this.inferredJointBrush;                    
        }

        if (drawBrush != null)
        {
            drawingContext.DrawEllipse(drawBrush, null, this.SkeletonPointToScreen(joint.Position), JointThickness, JointThickness);
        }
    }
}

ボーンは気にしないので、ボーンを描画する関数呼び出しを削除できます。

private void DrawBonesAndJoints(Skeleton skeleton, DrawingContext drawingContext)
{
    // Render Joints
    foreach (Joint joint in skeleton.Joints)
    {
        Brush drawBrush = null;

        if (joint.TrackingState == JointTrackingState.Tracked)
        {
            drawBrush = this.trackedJointBrush;                    
        }
        else if (joint.TrackingState == JointTrackingState.Inferred)
        {
            drawBrush = this.inferredJointBrush;                    
        }

        if (drawBrush != null)
        {
            drawingContext.DrawEllipse(drawBrush, null, this.SkeletonPointToScreen(joint.Position), JointThickness, JointThickness);
        }
    }
}

これで、すべての関節にドットを描画するプログラムができました。あなたが望むのは手だけなら...

private void DrawBonesAndJoints(Skeleton skeleton, DrawingContext drawingContext)
{
    drawingContext.DrawEllipse(trackedJointBrush, null, SkeletonPointToScreen(skeleton.Joints[JointType.HandLeft].Position), JointThickness, JointThickness);
    drawingContext.DrawEllipse(trackedJointBrush, null, SkeletonPointToScreen(skeleton.Joints[JointType.HandRight].Position), JointThickness, JointThickness);
}

これで、手に2つの小さな点が続きます。

于 2012-10-18T17:43:51.307 に答える