Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>As Renaud Dumont stated, I would do something with <code>JointTrackingState</code>. Since your using knees, I used the variables <code>leftknee</code> and <code>rightknee</code> which are <code>Joints</code> to do it. Here's code, You might use <code>JointType.FootRight</code> and <code>JointType.FootLeft</code> and the <code>Hip</code> types, but I'll leave that up to you.</p> <pre><code>static Skeleton first = new Skeleton(); Joint leftknee = first.Joints[JointType.KneeLeft]; Joint rightknee = first.Joints[JointType.KneeRight]; if ((leftknee.TrackingState == JointTrackingState.Inferred || leftknee.TrackingState == JointTrackingState.Tracked) &amp;&amp; (rightknee.TrackingState == JointTrackingState.Tracked || rightknee.TrackingState == JointTrackingState.Inferred)) { } </code></pre> <p>Or alternately, if you just wanted one knee to be tracked at a time, or both, you could do this:</p> <pre><code>if ((leftknee.TrackingState == JointTrackingState.Inferred || leftknee.TrackingState == JointTrackingState.Tracked) &amp;&amp; (rightknee.TrackingState == JointTrackingState.Tracked || rightknee.TrackingState == JointTrackingState.Inferred)) { } else if (leftknee.TrackingState == JointTrackingState.Inferred || leftknee.TrackingState == JointTrackingState.Tracked) { } else if (rightknee.TrackingState == JointTrackingState.Inferred || rightknee.TrackingState == JointTrackingState.Tracked) { } </code></pre> <p>FYI the reason the <code>Skeleton</code> is <code>first</code> is <code>static</code> is because then it can be used in making the joints</p> <pre><code> static Skeleton first; </code></pre> <p>Opposed to </p> <pre><code> Skeleton first; </code></pre> <p><h3>Edit 1</h3><br/> I've come to the conclusion this is <strong>extremely</strong> difficult to do, I think the above method will work, but I just wanted to include what I'm working on in case you might be able to find some way to make it work. Anyways Here's the code I was working on which is another <code>class</code> which is just another <code>SkeletalTrackingState</code> I was trying to make an <code>Inferred</code> <code>enum</code> in it. But unfortunately <code>enum</code> are <a href="https://stackoverflow.com/questions/757684/enum-inheritance">impossible</a> to <code>inherit</code>. If you find something to this effect that works, I will respect you as a superior programmer to me forever ;). Without further ado: The <code>.dll</code> I was trying to make:</p> <pre><code>using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Kinect; namespace IsInferred { public abstract class SkeletonInferred : Skeleton { public bool inferred; static Skeleton first1 = new Skeleton(); Joint handright; Joint handleft; Joint footright; Joint footleft; Joint ankleleft; Joint ankleright; Joint elbowleft; Joint elbowright; Joint head; Joint hipcenter; Joint hipleft; Joint hipright; Joint shouldercenter; Joint shoulderleft; Joint shoulderright; Joint kneeleft; Joint kneeright; Joint spine; Joint wristleft; Joint wristright; public SkeletonInferred(bool inferred) { } public enum Inferred { NotTracked = SkeletonTrackingState.NotTracked, PositionOnly = SkeletonTrackingState.PositionOnly, Tracked = SkeletonTrackingState.Tracked, Inferred = 3, } private void IsInferred(object sender, AllFramesReadyEventArgs e) { handright = first1.Joints[JointType.HandRight]; handleft = first1.Joints[JointType.HandLeft]; footright = first1.Joints[JointType.FootRight]; footleft = first1.Joints[JointType.FootLeft]; ankleleft = first1.Joints[JointType.AnkleLeft]; ankleright = first1.Joints[JointType.AnkleRight]; elbowleft = first1.Joints[JointType.ElbowLeft]; elbowright = first1.Joints[JointType.ElbowRight]; head = first1.Joints[JointType.Head]; hipcenter = first1.Joints[JointType.HipCenter]; hipleft = first1.Joints[JointType.HipLeft]; hipright = first1.Joints[JointType.HipRight]; shouldercenter = first1.Joints[JointType.ShoulderCenter]; shoulderleft = first1.Joints[JointType.ShoulderLeft]; shoulderright = first1.Joints[JointType.ShoulderRight]; kneeleft = first1.Joints[JointType.KneeLeft]; kneeright = first1.Joints[JointType.KneeRight]; spine = first1.Joints[JointType.Spine]; wristleft = first1.Joints[JointType.WristLeft]; wristright = first1.Joints[JointType.WristRight]; if (handleft.TrackingState == JointTrackingState.Inferred &amp; handright.TrackingState == JointTrackingState.Inferred &amp; head.TrackingState == JointTrackingState.Inferred &amp; footleft.TrackingState == JointTrackingState.Inferred &amp; footright.TrackingState == JointTrackingState.Inferred &amp; ankleleft.TrackingState == JointTrackingState.Inferred &amp; ankleright.TrackingState == JointTrackingState.Inferred &amp; elbowleft.TrackingState == JointTrackingState.Inferred &amp; elbowright.TrackingState == JointTrackingState.Inferred &amp; hipcenter.TrackingState == JointTrackingState.Inferred &amp; hipleft.TrackingState == JointTrackingState.Inferred &amp; hipright.TrackingState == JointTrackingState.Inferred &amp; shouldercenter.TrackingState == JointTrackingState.Inferred &amp; shoulderleft.TrackingState == JointTrackingState.Inferred &amp; shoulderright.TrackingState == JointTrackingState.Inferred &amp; kneeleft.TrackingState == JointTrackingState.Inferred &amp; kneeright.TrackingState == JointTrackingState.Inferred &amp; spine.TrackingState == JointTrackingState.Inferred &amp; wristleft.TrackingState == JointTrackingState.Inferred &amp; wristright.TrackingState == JointTrackingState.Inferred) { inferred = true; } } } } </code></pre> <p>The code in your project (compiler error)</p> <pre><code> using IsInferred; static bool Inferred = false; SkeletonInferred inferred = new SkeletonInferred(Inferred); static Skeleton first1 = new Skeleton(); Skeleton foundSkeleton = skeletons.FirstOrDefault&lt;Skeleton&gt;(skeleton =&gt; skeleton.TrackingState == SkeletonTrackingState.Inferred); </code></pre> <p>Good luck, I hope this helps you get going in the right direction or helps you at all!</p> My Code <p><br/> Here's my code that you asked for. Yes it is from the <a href="http://channel9.msdn.com/Series/KinectQuickstart/Skeletal-Tracking-Fundamentals" rel="nofollow noreferrer">Skeletal Tracking Fundamentals</a>, but this code was here and I didn't want to start a new project with most of the same stuff. Enjoy! <br/></p> <h3>Code</h3> <pre><code> // (c) Copyright Microsoft Corporation. // This source is subject to the Microsoft Public License (Ms-PL). // Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details. // All other rights reserved. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Microsoft.Kinect; using Coding4Fun.Kinect.Wpf; namespace SkeletalTracking { /// &lt;summary&gt; /// Interaction logic for MainWindow.xaml /// &lt;/summary&gt; public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } bool closing = false; const int skeletonCount = 6; Skeleton[] allSkeletons = new Skeleton[skeletonCount]; private void Window_Loaded(object sender, RoutedEventArgs e) { kinectSensorChooser1.KinectSensorChanged += new DependencyPropertyChangedEventHandler(kinectSensorChooser1_KinectSensorChanged); } void kinectSensorChooser1_KinectSensorChanged(object sender, DependencyPropertyChangedEventArgs e) { KinectSensor old = (KinectSensor)e.OldValue; StopKinect(old); KinectSensor sensor = (KinectSensor)e.NewValue; if (sensor == null) { return; } var parameters = new TransformSmoothParameters { Smoothing = 0.3f, Correction = 0.0f, Prediction = 0.0f, JitterRadius = 1.0f, MaxDeviationRadius = 0.5f }; sensor.SkeletonStream.Enable(parameters); //sensor.SkeletonStream.Enable(); sensor.AllFramesReady += new EventHandler&lt;AllFramesReadyEventArgs&gt;(sensor_AllFramesReady); sensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30); sensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30); try { sensor.Start(); } catch (System.IO.IOException) { kinectSensorChooser1.AppConflictOccurred(); } } void sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e) { if (closing) { return; } //Get a skeleton Skeleton first = GetFirstSkeleton(e); if (first == null) { return; } //set scaled position //ScalePosition(headImage, first.Joints[JointType.Head]); ScalePosition(leftEllipse, first.Joints[JointType.HandLeft]); ScalePosition(rightEllipse, first.Joints[JointType.HandRight]); ScalePosition(leftknee, first.Joints[JointType.KneeLeft]); ScalePosition(rightknee, first.Joints[JointType.KneeRight]); GetCameraPoint(first, e); } void GetCameraPoint(Skeleton first, AllFramesReadyEventArgs e) { using (DepthImageFrame depth = e.OpenDepthImageFrame()) { if (depth == null || kinectSensorChooser1.Kinect == null) { return; } //Map a joint location to a point on the depth map //head DepthImagePoint headDepthPoint = depth.MapFromSkeletonPoint(first.Joints[JointType.Head].Position); //left hand DepthImagePoint leftDepthPoint = depth.MapFromSkeletonPoint(first.Joints[JointType.HandLeft].Position); //right hand DepthImagePoint rightDepthPoint = depth.MapFromSkeletonPoint(first.Joints[JointType.HandRight].Position); DepthImagePoint rightKnee = depth.MapFromSkeletonPoint(first.Joints[JointType.KneeRight].Position); DepthImagePoint leftKnee = depth.MapFromSkeletonPoint(first.Joints[JointType.KneeLeft].Position); //Map a depth point to a point on the color image //head ColorImagePoint headColorPoint = depth.MapToColorImagePoint(headDepthPoint.X, headDepthPoint.Y, ColorImageFormat.RgbResolution640x480Fps30); //left hand ColorImagePoint leftColorPoint = depth.MapToColorImagePoint(leftDepthPoint.X, leftDepthPoint.Y, ColorImageFormat.RgbResolution640x480Fps30); //right hand ColorImagePoint rightColorPoint = depth.MapToColorImagePoint(rightDepthPoint.X, rightDepthPoint.Y, ColorImageFormat.RgbResolution640x480Fps30); ColorImagePoint leftKneeColorPoint = depth.MapToColorImagePoint(leftKnee.X, leftKnee.Y, ColorImageFormat.RgbResolution640x480Fps30); ColorImagePoint rightKneeColorPoint = depth.MapToColorImagePoint(rightKnee.X, rightKnee.Y, ColorImageFormat.RgbResolution640x480Fps30); //Set location CameraPosition(headImage, headColorPoint); CameraPosition(leftEllipse, leftColorPoint); CameraPosition(rightEllipse, rightColorPoint); Joint LEFTKNEE = first.Joints[JointType.KneeLeft]; Joint RIGHTKNEE = first.Joints[JointType.KneeRight]; if ((LEFTKNEE.TrackingState == JointTrackingState.Inferred || LEFTKNEE.TrackingState == JointTrackingState.Tracked) &amp;&amp; (RIGHTKNEE.TrackingState == JointTrackingState.Tracked || RIGHTKNEE.TrackingState == JointTrackingState.Inferred)) { CameraPosition(rightknee, rightKneeColorPoint); CameraPosition(leftknee, leftKneeColorPoint); } else if (LEFTKNEE.TrackingState == JointTrackingState.Inferred || LEFTKNEE.TrackingState == JointTrackingState.Tracked) { CameraPosition(leftknee, leftKneeColorPoint); } else if (RIGHTKNEE.TrackingState == JointTrackingState.Inferred || RIGHTKNEE.TrackingState == JointTrackingState.Tracked) { CameraPosition(rightknee, rightKneeColorPoint); } } } Skeleton GetFirstSkeleton(AllFramesReadyEventArgs e) { using (SkeletonFrame skeletonFrameData = e.OpenSkeletonFrame()) { if (skeletonFrameData == null) { return null; } skeletonFrameData.CopySkeletonDataTo(allSkeletons); //get the first tracked skeleton Skeleton first = (from s in allSkeletons where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault(); return first; } } private void StopKinect(KinectSensor sensor) { if (sensor != null) { if (sensor.IsRunning) { //stop sensor sensor.Stop(); //stop audio if not null if (sensor.AudioSource != null) { sensor.AudioSource.Stop(); } } } } private void CameraPosition(FrameworkElement element, ColorImagePoint point) { //Divide by 2 for width and height so point is right in the middle // instead of in top/left corner Canvas.SetLeft(element, point.X - element.Width / 2); Canvas.SetTop(element, point.Y - element.Height / 2); } private void ScalePosition(FrameworkElement element, Joint joint) { //convert the value to X/Y //Joint scaledJoint = joint.ScaleTo(1280, 720); //convert &amp; scale (.3 = means 1/3 of joint distance) Joint scaledJoint = joint.ScaleTo(1280, 720, .3f, .3f); Canvas.SetLeft(element, scaledJoint.Position.X); Canvas.SetTop(element, scaledJoint.Position.Y); } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { closing = true; StopKinect(kinectSensorChooser1.Kinect); } private void kinectDepthViewer1_Loaded(object sender, RoutedEventArgs e) { } } } </code></pre> <h3>XAML</h3> <pre><code>&lt;Window x:Class="SkeletalTracking.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="600" Width="800" Loaded="Window_Loaded" xmlns:my="clr-namespace:Microsoft.Samples.Kinect.WpfViewers;assembly=Microsoft.Samples.Kinect.WpfViewers" Closing="Window_Closing" WindowState="Maximized"&gt; &lt;Canvas Name="MainCanvas"&gt; &lt;my:KinectColorViewer Canvas.Left="0" Canvas.Top="0" Width="640" Height="480" Name="kinectColorViewer1" Kinect="{Binding ElementName=kinectSensorChooser1, Path=Kinect}" /&gt; &lt;Ellipse Canvas.Left="0" Canvas.Top="0" Height="50" Name="leftEllipse" Width="50" Fill="#FF4D298D" Opacity="1" Stroke="White" /&gt; &lt;Ellipse Canvas.Left="100" Canvas.Top="0" Fill="#FF2CACE3" Height="50" Name="rightEllipse" Width="50" Opacity="1" Stroke="White" /&gt; &lt;my:KinectSensorChooser Canvas.Left="250" Canvas.Top="380" Name="kinectSensorChooser1" Width="328" /&gt; &lt;Image Canvas.Left="66" Canvas.Top="90" Height="87" Name="headImage" Stretch="Fill" Width="84" Source="/SkeletalTracking;component/c4f-color.png" /&gt; &lt;Ellipse Canvas.Left="283" Canvas.Top="233" Height="23" Name="leftknee" Stroke="Black" Width="29" /&gt; &lt;Ellipse Canvas.Left="232" Canvas.Top="233" Height="23" Name="rightknee" Stroke="Black" Width="30" /&gt; &lt;/Canvas&gt; </code></pre> <p></p> <p>Here's a picture just to show how off Kinect can be sometimes:<br/> <img src="https://i.imgur.com/EKqkZ.png" width="320" height="242"><br/> Hint: Notice how only my arm is detected and part of the background</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload