2

ユーザーの右手で作成された円を認識するロジックを開発しようとしています。サンプルコードからスケルトンを描画して追跡するコードを取得しました。

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);
            }
        }

        using (DrawingContext dc = this.drawingGroup.Open())
        {
            // Draw a transparent background to set the render size
            dc.DrawRectangle(Brushes.Black, null, new Rect(0.0, 0.0, RenderWidth, RenderHeight));

            if (skeletons.Length != 0)
            {
                foreach (Skeleton skel in skeletons)
                {
                    RenderClippedEdges(skel, dc);

                    if (skel.TrackingState == SkeletonTrackingState.Tracked)
                    {
                        this.DrawBonesAndJoints(skel, dc);
                    }
                    else if (skel.TrackingState == SkeletonTrackingState.PositionOnly)
                    {
                        dc.DrawEllipse(
                        this.centerPointBrush,
                        null,
                        this.SkeletonPointToScreen(skel.Position),
                        BodyCenterThickness,
                        BodyCenterThickness);
                    }
                }
            }

            // prevent drawing outside of our render area
            this.drawingGroup.ClipGeometry = new RectangleGeometry(new Rect(0.0, 0.0, RenderWidth, RenderHeight));
        }
    }

私が今やりたいのは、ジェスチャ認識のためにユーザーの右手の座標を追跡することです。

これが私が仕事を成し遂げることを計画している方法です:

  1. ジェスチャーを開始します
  2. 丸で囲んだジェスチャを描画します。開始の座標を保存してから、開始からジョイントが45度シフトするたびに座標を記録します。8オクタントの場合、8つのサンプルを取得します。
  3. 円が描かれたことを決定するために、8つのサンプル間の関係を確認することができます。

また、深度画像では、描画されたジェスチャの軌跡を表示したいので、ハンドポイントが移動すると痕跡が残り、最後にユーザーが描画した図が表示されます。これを実現する方法がわかりません。

4

1 に答える 1

4

各ジョイントの座標は、各SkeletonFrameReadyイベント中に追跡された各スケルトンで使用できます。ループの内側foreach...

foreach (Skeleton skeleton in skeletons) {
    // get the joint
    Joint rightHand = skeleton.Joints[JointType.HandRight];

    // get the individual points of the right hand
    double rightX = rightHand.Position.X;
    double rightY = rightHand.Position.Y;
    double rightZ = rightHand.Position.Z;
}

列挙型を見て、JointType任意のジョイントを引き出し、個々の座標を操作できます。

ジェスチャトレイルを描画するDrawContextには、例にあるものを使用するか、別の方法を使用Pathしてビジュアルレイヤーに描画します。x / y / z値を使用して、それらをウィンドウ座標にスケーリングする必要があります。「Coding4Fun」ライブラリは、それを実行するためのビルド済み関数を提供します。または、次のように独自に作成することもできます。

private static double ScaleY(Joint joint)
{
    double y = ((SystemParameters.PrimaryScreenHeight / 0.4) * -joint.Position.Y) + (SystemParameters.PrimaryScreenHeight / 2);
    return y;
}

private static void ScaleXY(Joint shoulderCenter, bool rightHand, Joint joint, out int scaledX, out int scaledY)
{
    double screenWidth = SystemParameters.PrimaryScreenWidth;

    double x = 0;
    double y = ScaleY(joint);

    // if rightHand then place shouldCenter on left of screen
    // else place shouldCenter on right of screen
    if (rightHand)
    {
        x = (joint.Position.X - shoulderCenter.Position.X) * screenWidth * 2;
    }
    else
    {
        x = screenWidth - ((shoulderCenter.Position.X - joint.Position.X) * (screenWidth * 2));
    }


    if (x < 0)
    {
        x = 0;
    }
    else if (x > screenWidth - 5)
    {
        x = screenWidth - 5;
    }

    if (y < 0)
    {
        y = 0;
    }

    scaledX = (int)x;
    scaledY = (int)y;
}
于 2012-11-12T04:06:03.410 に答える