Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使SkeletonFrames在我的点击事件中可用?_C#_Image Processing_Kinect_Motion Detection - Fatal编程技术网

C# 如何使SkeletonFrames在我的点击事件中可用?

C# 如何使SkeletonFrames在我的点击事件中可用?,c#,image-processing,kinect,motion-detection,C#,Image Processing,Kinect,Motion Detection,我希望我的SkeletonFrames在单击事件中可用。有什么办法使它成为可能吗 我计划创建一个Kinect,将图像放置在骨骼关节上。这是我的代码 private void button1_Click(object sender, RoutedEventArgs e) { foreach (SkeletonData data in e.SkeletonFrame.Skeletons) { foreach (Joint joint in data.Joints)

我希望我的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;
            }
        }
    }
}
private void按钮1\u单击(对象发送者,路由目标)
{
foreach(e.SkeletonFrame.Skeletons中的SkeletonData数据)
{
foreach(数据中的关节。关节)
{
如果(接头位置W<0.6f)返回;
开关(关节ID)
{
箱头:
var heanp=getDisplayPosition(关节);
Canvas.SetLeft(imgHead,heanp.X);
Canvas.SetTop(imgHead,heanp.Y);
打破
}
}
}
}

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

您可以捕获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事件的数组(Skelets)

根据下面的评论,您需要升级到SDK的v1.6,并阅读Microsoft提供的示例。尽管他们可能无法完全满足您当前项目的需求,但他们将教您使用Microsoft Kinect for Windows的基本原理,并让您了解如何使用传感器

对于您当前的情况,您最想看的示例是SkeletonBasics WPF示例。这将向您展示如何跟踪骨架并从中提取数据。它还精确地显示了如何在跟踪点上以及跟踪点之间绘制项目

对于您的情况,最相关的功能是Drawbones和Joints功能:

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”吗???我不确定。对不起,请帮我一下……你需要使用最新的SDK。如果你对这一点如此陌生,那么学习一些如此过时的东西会给你自己带来很大的伤害。v1.0和v1.6之间的差异并不是微不足道的。最新的SDK有多个如何从骨架和inte获取数据的示例我做了一些研究,但不幸的是,没有“在骨骼关节上放置图像”的样本。很少有网站有这个项目,但他们没有发布他们的来源…所以我看到了,这导致我使用这个SDK1.0…:(SDK v1.6中的SkeletonBasics WPF示例可以做到这一点,甚至更多。它演示了如何围绕跟踪骨架的关节和骨骼绘制完整的骨架。如果您关心的只是手关节,那么您只需避免绘制其他关节……到目前为止,基于注释链的答案更新了一大堆。