Kinect:我如何识别第一个被跟踪的骨架并在之后用它做任务

我如何识别kinect跟踪的第一个骨架,然后用它做任务。 我只对第一个骨架感兴趣,以及在我不需要它们之后的任何一个。 优选地,根本不跟踪进入的下一个骨架。

有人可以帮我这个谢谢。 目前我正在使用的代码不起作用。 我已经尝试了一些快速的linq查询,但我不太确定如何使用它。 总是有错误。

有人可以给我一些例子,我可以提前感谢!!

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(160, 0.0, RenderWidth, RenderHeight)); if (skeletons.Length != 0) { foreach (Skeleton skel in skeletons) { RenderClippedEdges(skel, dc); if (skel.TrackingState == SkeletonTrackingState.Tracked) { this.TrackingId = Skel; sensor.SkeletonStream.AppChoosesSkeletons = true; sensor.SkeletonStream.ChooseSkeletons(skel.TrackingId); this.DrawBonesAndJoints(skel, dc); if (skel == null) { Process.Start("wmplayer.exe", "C:\\Users\\User\\Downloads\\Test.wma"); } } else if (skel.TrackingState == SkeletonTrackingState.NotTracked) { sensor.SkeletonStream.AppChoosesSkeletons = false; } } } // prevent drawing outside of our render area this.drawingGroup.ClipGeometry = new RectangleGeometry(new Rect(160, 0.0, RenderWidth, RenderHeight)); } } 

您只能使用以下代码跟踪一个骨架:

 int trackingID; skeletonTracked = new Skeleton(); bool first = true; Skeleton skeleton; Skeleton[] skeletons = new Skeleton[6]; ... public void AllFramesReady(object sender, AllFramesReadyEventArgs e) { using (SkeletonFrame sFrame = e.OpenSkeletonFrame()) { sFrame.CopySkeletonDataTo(skeletons); skeleton = (from s in skeletons where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault(); if (skeleton == null) return; } using (DrawingContext dc = this.drawingGroup.Open()) { // Draw a transparent background to set the render size dc.DrawRectangle(Brushes.Black, null, new Rect(160, 0.0, RenderWidth, RenderHeight)); RenderClippedEdges(skel, dc); if (skeleton.TrackingState == SkeletonTrackingState.Tracked) { if (first) { skeletonTracked = skeleton; trackingId = skeleton.TrackingID; ... first = false; } if (skeleton.TrackingID == trackingId) { ... } } ... } } 

此代码查找检测到的第一个骨架,如果它的跟踪ID等于检测到的第一个骨架,则使用它执行操作,否则您不会对稍后检测到的其他骨架执行操作。 但是,我会看到Kinect用户检测,因为它有其他检测具有单独的id /索引的骨架的方法。 ID的方法非常适合区分多个玩家,但它们对于每个骨骼都有很大的变化。 索引会保存很短的时间,因此您可以使用一些代码来检测骨架离开帧。

每当检测到新的时候,Kinect跟踪播放器和设置ID在Skeletons数组的不同索引(长度== 6)中。 这就是为什么在跟踪id等于零的索引数为5时需要保存玩家ID的原因。

  int skeletonId = 0; int trackId = 0; void myKinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { Skeleton[] skeletons = null; using (SkeletonFrame frame = e.OpenSkeletonFrame()) { if (frame != null) { skeletons = new Skeleton[frame.SkeletonArrayLength]; frame.CopySkeletonDataTo(skeletons); } } if (skeletons == null) return; //variable for count of null ID int skeletonsNull = 0; //counting... foreach (Skeleton skeletonText in skeletons) { if (skeletonText.TrackingId == 0) { skeletonsNull++; } else { skeletonId = skeletonText.TrackingId; } } if (skeletonsNull == 5) { trackId = skeletonId; } foreach (Skeleton skeleton in skeletons) { if (skeleton.TrackingId == trackId) { //do something }