C# 如何使SkeletonFrames在我的点击事件中可用?
我希望我的SkeletonFrames在单击事件中可用。有什么办法使它成为可能吗 我计划创建一个Kinect,将图像放置在骨骼关节上。这是我的代码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)
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示例可以做到这一点,甚至更多。它演示了如何围绕跟踪骨架的关节和骨骼绘制完整的骨架。如果您关心的只是手关节,那么您只需避免绘制其他关节……到目前为止,基于注释链的答案更新了一大堆。