首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到关节坐标(X,Y,Z),以及如何绘制跟踪关节的轨迹?

如何找到关节坐标(X,Y,Z),以及如何绘制跟踪关节的轨迹?
EN

Stack Overflow用户
提问于 2012-11-11 22:59:13
回答 1查看 9.9K关注 0票数 2

我试图开发一个逻辑来识别一个由用户右手组成的圆圈,我得到了从示例代码中绘制框架和跟踪的代码,

代码语言:javascript
复制
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. 为了决定是否画了一个圆,我们可以检查这八个样本之间的关系。

此外,在深度图像中,我想显示绘制手势的轨迹,因此当手点移动时,它会留下痕迹,所以在最后,我们将得到一个用户绘制的图形。我不知道如何做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-12 04:06:03

在每个SkeletonFrameReady事件期间,每个关节的坐标都可用于每个跟踪骨架。在你的foreach循环里..。

代码语言:javascript
复制
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“库提供了一个预先构建的函数来完成它;或者,您也可以编写自己的库,例如:

代码语言:javascript
复制
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;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13336382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档