【问题标题】:How to make SkeletonFrames avaible in my click event?如何在我的点击事件中使骨架框架可用?
【发布时间】:2012-10-18 12:17:42
【问题描述】:

我希望我的 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;
            }
        }
    }
}

如果有任何错误,请纠正我。

【问题讨论】:

    标签: c# image-processing kinect motion-detection


    【解决方案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 事件的数组 (skeletons)。

    基于下面制作的cmets,你需要升级到v1.6的SDK,并通过微软提供的示例。尽管它们可能不会完全按照您的当前项目所需的方式执行,但它们会教您使用 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);
    }
    

    现在你的手周围会有两个小点。

    【讨论】:

    • 嗨,我使用 v1.0 是因为 v1.6 没有关于“将图像放在骨架关节和悬停按钮上”的示例 ...=(对不起,我只是一个新手...我可以知道如何将最后捕获的骨架保存到全局变量中吗?是写“全局 xxxxx”吗???我不确定。T-T 抱歉,但请帮帮我...
    • 您需要使用最新的 SDK。如果您对此如此陌生,那么您通过学习如此过时的东西对自己造成了极大的伤害。 v1.0 和 v1.6 之间的区别不是微不足道的。最新的 SDK 有多个示例,说明如何从骨架中获取数据并与该数据进行交互。
    • 我做了一些研究,但不幸的是没有“在骨骼关节上放置图像”的样本很少有网站有这个项目,但他们没有发布他们的资源......所以我看到了@987654321 @ 和 diaryofaninja.com/blog/2011/10/19/… 这导致我使用这个 SDK1.0 ... :(
    • SDK v1.6 中的 SkeletonBasics-WPF 示例可以做到这一点——甚至更多。它演示了如何围绕被跟踪骨骼的关节和骨骼绘制完整 骨骼。如果您只关心手关节,那么您只需避免绘制其他关节。
    • ...到目前为止,根据评论链对答案进行了一大堆更新。
    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多