0

私はこれを数日間調査してきましたが、成功していません。スタックオーバーフローが私の情報源の1つであるという他の質問を見ています。Kinect for Windows を使用して、ユーザーの関節を追跡し、別の「画面」にスケルトンを描画するプログラムを作成しています。既に関節自体をマッピングしており、画像 (赤い点) を使用して位置を示しています。マッピングされたジョイントの。

私の次のステップは、ある関節から別の関節に線を引くことによって骨格自体を構築することです.私が抱えている問題は、線を描く方法です...私は物事を複雑にしすぎる傾向があるので、私はただ作っているだけなのか疑問に思っています.最も簡単な解決策を見つけるだけではなく、自分にとって難しいこと。

99% は進んでいると感じていますが、まだ 1 つのエラーが発生していて、理解できません。エラー メッセージと関連する C# コードを以下で見つけてください。

"cannot convert from 'Microsoft.Kinect.SkeletonPoint' to 'System.Windows.Point"

コード:

private void DrawBone (Joint jointFrom, Joint jointTo)
{
    Brush centerPointBrush;
    Pen trackedBonePen = new Pen(Brushes.White, TrackedBoneThickness);
    inferredBonePen = new Pen(Brushes.Gray, InferredBoneThickness);
    DrawingVisual visual = new DrawingVisual();
    DrawingContext context = visual.RenderOpen();

    centerPointBrush = Brushes.Red;

    if (jointFrom.TrackingState == JointTrackingState.NotTracked
        || jointTo.TrackingState == JointTrackingState.NotTracked)
    {
        return;
    }

    if (jointFrom.TrackingState == JointTrackingState.Inferred
        || jointTo.TrackingState == JointTrackingState.Inferred)
    {       
        context.DrawLine(inferredBonePen,jointFrom.Position, jointTo.Position);
    }

    if (jointFrom.TrackingState == JointTrackingState.Tracked
        || jointTo.TrackingState == JointTrackingState.Tracked)
    {
        context.DrawLine(trackedBonePen, jointFrom.Position, jointTo.Position);
    }
}

で始まる行に関連するエラー。context.DrawLineこれらは関数の引数が正しくないため、次DrawLineの付随するエラーが発生します。

Error 4 The best overloaded method match for
'System.Windows.Media.DrawingContext.DrawLine(System.Windows.Media.Pen,
System.Windows.Point, System.Windows.Point)' has some invalid arguments
4

4 に答える 4

1

車輪を再発明しないでください。マイクロソフトの人たちはそこで素晴らしい仕事をしました。多分このコードはあなたを助けるでしょう:

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);
                }
            }
        }
于 2014-12-28T15:32:16.977 に答える
0

Miky Dinescu が指摘しているように、差し迫った問題は aMicrosoft.Kinect.Joint.Positionを aに変換する必要があることSystem.Windows.Pointです。

Z値 (深さ) を気にしない可能性が高いため、XYをウィンドウのサイズに正規化する必要があります。描画されたスケルトンをどのように動作させたいかによって、これは常にJointType.Spineウィンドウの中央に配置するのと同じくらい簡単な場合があります。または、プレイヤーが Kinect の FOV 内のどこにいるかに基づいて、ウィンドウ内のどこにスケルトンを表示する必要があるかを変換するために、追加の計算を行う必要がある場合があります。

Kinect の入力に基づくスケルトンの描画は、Kinect for Windows Toolkitから入手できる複数の例で示されています。「スケルトンの基本」と「シェイプ ゲーム」の例は、すぐに思い浮かびます。また、 Kinect for Windows Samples CodePlexページでのみコードを見つけることもできます (これらの例は SDK 1.6 用にコーディングされており、SDK 1.7 でも問題なく動作します)。

「スケルトンの基本」の例のMainWindow.xaml.csを次に示します。DrawBone の関数に注意して、DrawBonesAndJoints' and何をしたいのかを示してください。

于 2013-03-28T15:12:00.553 に答える
0

よく理解できていないかもしれませんが、なぜすでに行われていることをやりたいのでしょうか? これは、Kinect Developer Toolkit 1.8 のサンプル コードです。

    private void DrawBone(Skeleton skeleton, DrawingContext drawingContext, JointType jointType0, JointType jointType1)
    {
        Joint joint0 = skeleton.Joints[jointType0];
        Joint joint1 = skeleton.Joints[jointType1];

        // If we can't find either of these joints, exit
        if (joint0.TrackingState == JointTrackingState.NotTracked || joint1.TrackingState == JointTrackingState.NotTracked)
        {
            return;
        }

        // Don't draw if both points are inferred
        if (joint0.TrackingState == JointTrackingState.Inferred && joint1.TrackingState == JointTrackingState.Inferred)
        {
            return;
        }

        // We assume all drawn bones are inferred unless BOTH joints are tracked
        Pen drawPen = this.inferredBonePen;

        if (joint0.TrackingState == JointTrackingState.Tracked && joint1.TrackingState == JointTrackingState.Tracked)
        {
            drawPen = this.trackedBonePen;
        }

        drawingContext.DrawLine(drawPen, this.SkeletonPointToScreen(joint0.Position), this.SkeletonPointToScreen(joint1.Position));
    }
于 2014-10-03T16:08:15.717 に答える
0

エラーメッセージはそれをすべて言います。jointFrom.Positionを直接使用する代わりにSystem.Windows.Point、 の座標を表すを作成し、代わりに にjointFrom渡す必要がありDrawLineます。

…にも同じことが言えjointToます</p>

複雑なのは、スケルトンの位置、つまりfromJoint.Positionが 3D 座標を表すのに対し、線を描くために使用される点は 2D 座標であることです。したがって、直接変換はできません。むしろ、関節の位置を 2D で投影し、投影された点を使用して線を引く必要があります。

他のオプションは、ビジュアルに描画するだけでなく、WPF で 3D 描画を使用することです。

于 2013-03-28T12:11:01.437 に答える