From 680b1ca2bb49de297ae28b945325cc412ee2c1fe Mon Sep 17 00:00:00 2001
From: BlubbFish <git@blubbfish.net>
Date: Wed, 9 Nov 2016 14:18:10 +0000
Subject: [PATCH]

---
 Demo1/Demo1/Demo1.csproj                |   6 +-
 Demo1/Demo1/DepthFrameConverter.cs      | 153 ++++++++++---------
 Demo1/Demo1/MainWindow.xaml             |   7 +-
 Demo1/Demo1/MainWindow.xaml.cs          | 189 ++++++++++++++++++------
 Demo1/Demo1/SkeletalCommonExtensions.cs |   9 +-
 5 files changed, 241 insertions(+), 123 deletions(-)

diff --git a/Demo1/Demo1/Demo1.csproj b/Demo1/Demo1/Demo1.csproj
index 6d7bde2..e49a923 100644
--- a/Demo1/Demo1/Demo1.csproj
+++ b/Demo1/Demo1/Demo1.csproj
@@ -36,9 +36,13 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="Microsoft.Research.Kinect, Version=1.0.0.45, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
+    <Reference Include="Microsoft.Kinect, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>C:\Program Files\Microsoft SDKs\Kinect\v1.7\Assemblies\Microsoft.Kinect.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Data" />
+    <Reference Include="System.Drawing" />
     <Reference Include="System.Xml" />
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Core" />
diff --git a/Demo1/Demo1/DepthFrameConverter.cs b/Demo1/Demo1/DepthFrameConverter.cs
index 2bea220..32d3bbb 100644
--- a/Demo1/Demo1/DepthFrameConverter.cs
+++ b/Demo1/Demo1/DepthFrameConverter.cs
@@ -1,11 +1,9 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using Microsoft.Kinect;
+using System.Drawing;
 
 namespace KinectWorkshop
 {
-    public class DepthFrameConverter
+    /*public class DepthFrameConverter
     {
         const int RED_IDX = 2;
         const int GREEN_IDX = 1;
@@ -14,71 +12,94 @@ namespace KinectWorkshop
 
         // Converts a 16-bit grayscale depth frame which includes player indexes into a 32-bit frame
         // that displays different players in different colors
-        public byte[] ConvertDepthFrameWithUser(byte[] depthFrame16)
+        public byte[] ConvertDepthFrameWithUser(DepthImagePixel[] depthFrame, int width, int height)
         {
-            for (int i16 = 0, i32 = 0; i16 < depthFrame16.Length && i32 < depthFrame32.Length; i16 += 2, i32 += 4)
+            Color c = Color.Empty;
+            byte[] ret = new byte[width * height * 4];
+            for (int x = 1; x < width; x++)
             {
-                int player = depthFrame16[i16] & 0x07;
-                //if ((y - 1) * 320 + x * 4 == i16)
-                //{
-                //    player = 8;
-                //}
-                int realDepth = (depthFrame16[i16 + 1] << 5) | (depthFrame16[i16] >> 3);
-                // transform 13-bit depth information into an 8-bit intensity appropriate
-                // for display (we disregard information in most significant bit)
-                byte intensity = (byte)(255 - (255 * realDepth / 0x0fff));
-
-                depthFrame32[i32 + RED_IDX] = 0;
-                depthFrame32[i32 + GREEN_IDX] = 0;
-                depthFrame32[i32 + BLUE_IDX] = 0;
-
-                // choose different display colors based on player
-                switch (player)
+                for (int y = 0; y < height; y++)
                 {
-                    case 0:
-                        depthFrame32[i32 + RED_IDX] = (byte)(intensity / 2);
-                        depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 2);
-                        depthFrame32[i32 + BLUE_IDX] = (byte)(intensity / 2);
-                        break;
-                    case 1:
-                        depthFrame32[i32 + RED_IDX] = intensity;
-                        break;
-                    case 2:
-                        depthFrame32[i32 + GREEN_IDX] = intensity;
-                        break;
-                    case 3:
-                        depthFrame32[i32 + RED_IDX] = (byte)(intensity / 4);
-                        depthFrame32[i32 + GREEN_IDX] = (byte)(intensity);
-                        depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
-                        break;
-                    case 4:
-                        depthFrame32[i32 + RED_IDX] = (byte)(intensity);
-                        depthFrame32[i32 + GREEN_IDX] = (byte)(intensity);
-                        depthFrame32[i32 + BLUE_IDX] = (byte)(intensity / 4);
-                        break;
-                    case 5:
-                        depthFrame32[i32 + RED_IDX] = (byte)(intensity);
-                        depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 4);
-                        depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
-                        break;
-                    case 6:
-                        depthFrame32[i32 + RED_IDX] = (byte)(intensity / 2);
-                        depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 2);
-                        depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
-                        break;
-                    case 7:
-                        depthFrame32[i32 + RED_IDX] = (byte)(255 - intensity);
-                        depthFrame32[i32 + GREEN_IDX] = (byte)(255 - intensity);
-                        depthFrame32[i32 + BLUE_IDX] = (byte)(255 - intensity);
-                        break;
-                    case 8:
-                        depthFrame32[i32 + RED_IDX] = 255;
-                        depthFrame32[i32 + GREEN_IDX] = 0;
-                        depthFrame32[i32 + BLUE_IDX] = 0;
-                        break;
+                    int i = ((y * width) + x) * 4;
+                    short depth = (depthFrame[x + y * width]).Depth;
+                    c = Color.Empty;
+                    if(depth > 0 && depth <= 4000)
+                    {
+                        int depthdist = (int)((depth / 4090f) * 255f);
+                        c = System.Drawing.Color.FromArgb((int)(depthdist / 2f), depthdist, (int)(depthdist * 0.7f));
+                    }
+                    ret[i] = c.B;
+                    ret[i] = c.G;
+                    ret[i] = c.R;
+                    ret[i] = 255;
                 }
+
             }
-            return depthFrame32;
+
+            /*   for (int i16 = 0, i32 = 0; i16 < depthFrame16.Length && i32 < depthFrame32.Length; i16 += 2, i32 += 4)
+           {
+               int player = depthFrame16[i16] & 0x07;
+               //if ((y - 1) * 320 + x * 4 == i16)
+               //{
+               //    player = 8;
+               //}
+               int realDepth = (depthFrame16[i16 + 1] << 5) | (depthFrame16[i16] >> 3);
+               // transform 13-bit depth information into an 8-bit intensity appropriate
+               // for display (we disregard information in most significant bit)
+               byte intensity = (byte)(255 - (255 * realDepth / 0x0fff));
+
+               depthFrame32[i32 + RED_IDX] = 0;
+               depthFrame32[i32 + GREEN_IDX] = 0;
+               depthFrame32[i32 + BLUE_IDX] = 0;
+
+               // choose different display colors based on player
+               switch (player)
+               {
+                   case 0:
+                       depthFrame32[i32 + RED_IDX] = (byte)(intensity / 2);
+                       depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 2);
+                       depthFrame32[i32 + BLUE_IDX] = (byte)(intensity / 2);
+                       break;
+                   case 1:
+                       depthFrame32[i32 + RED_IDX] = intensity;
+                       break;
+                   case 2:
+                       depthFrame32[i32 + GREEN_IDX] = intensity;
+                       break;
+                   case 3:
+                       depthFrame32[i32 + RED_IDX] = (byte)(intensity / 4);
+                       depthFrame32[i32 + GREEN_IDX] = (byte)(intensity);
+                       depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
+                       break;
+                   case 4:
+                       depthFrame32[i32 + RED_IDX] = (byte)(intensity);
+                       depthFrame32[i32 + GREEN_IDX] = (byte)(intensity);
+                       depthFrame32[i32 + BLUE_IDX] = (byte)(intensity / 4);
+                       break;
+                   case 5:
+                       depthFrame32[i32 + RED_IDX] = (byte)(intensity);
+                       depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 4);
+                       depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
+                       break;
+                   case 6:
+                       depthFrame32[i32 + RED_IDX] = (byte)(intensity / 2);
+                       depthFrame32[i32 + GREEN_IDX] = (byte)(intensity / 2);
+                       depthFrame32[i32 + BLUE_IDX] = (byte)(intensity);
+                       break;
+                   case 7:
+                       depthFrame32[i32 + RED_IDX] = (byte)(255 - intensity);
+                       depthFrame32[i32 + GREEN_IDX] = (byte)(255 - intensity);
+                       depthFrame32[i32 + BLUE_IDX] = (byte)(255 - intensity);
+                       break;
+                   case 8:
+                       depthFrame32[i32 + RED_IDX] = 255;
+                       depthFrame32[i32 + GREEN_IDX] = 0;
+                       depthFrame32[i32 + BLUE_IDX] = 0;
+                       break;
+               }
+           }
+           return depthFrame32;*
+            return ret;
         }
 
         internal byte[] ConvertDepthFrame(byte[] depthFrame16)
@@ -112,5 +133,5 @@ namespace KinectWorkshop
             }
             return depthFrame32;
         }
-    }
+    }*/
 }
diff --git a/Demo1/Demo1/MainWindow.xaml b/Demo1/Demo1/MainWindow.xaml
index 71a6b8e..4d70c16 100644
--- a/Demo1/Demo1/MainWindow.xaml
+++ b/Demo1/Demo1/MainWindow.xaml
@@ -4,12 +4,11 @@
         Title="MainWindow" Height="520" Width="660" Loaded="Window_Loaded" KeyUp="Window_KeyUp">
     <Grid>
         <Image Name="imgDepth" Width="640" Height="480" />
-        <!--<StackPanel Orientation="Vertical">
+        <!-- <StackPanel Orientation="Vertical">
             <Image Name="imgRgb" Width="320" Height="240" />
             <Image Name="imgDepthPlayer" Width="320" Height="240" />
-        </StackPanel>-->
+        </StackPanel> -->
 
-        <Canvas Name="MainCanvas">
-        </Canvas>
+        <Canvas Name="MainCanvas"/>
     </Grid>
 </Window>
diff --git a/Demo1/Demo1/MainWindow.xaml.cs b/Demo1/Demo1/MainWindow.xaml.cs
index 7bf2cc7..e782f50 100644
--- a/Demo1/Demo1/MainWindow.xaml.cs
+++ b/Demo1/Demo1/MainWindow.xaml.cs
@@ -11,7 +11,7 @@ using System.Windows.Media;
 using System.Windows.Media.Imaging;
 using System.Windows.Navigation;
 using System.Windows.Shapes;
-using Microsoft.Research.Kinect.Nui;
+using Microsoft.Kinect;
 
 namespace Demo1
 {
@@ -21,7 +21,14 @@ namespace Demo1
     public partial class MainWindow : Window
     {
         private KinectWorkshop.DepthFrameConverter cv = new KinectWorkshop.DepthFrameConverter();
-        private Camera _cam;
+        private KinectSensor r;
+        //private DepthImagePixel[] depthPixels;
+        //private byte[] colorPixels;
+        //private DepthImageFormat DepthFormat = DepthImageFormat.Resolution320x240Fps30;
+        //private ColorImageFormat ColorFormat = ColorImageFormat.RgbResolution640x480Fps30;
+        //private ColorImagePoint[] colorCoordinates;
+        //private bool init = false;
+
         public MainWindow()
         {
             InitializeComponent();
@@ -29,24 +36,29 @@ namespace Demo1
 
         private void Window_Loaded(object sender, RoutedEventArgs e)
         {
-            if (Runtime.Kinects.Count == 0)
+            if (KinectSensor.KinectSensors.Count == 0)
             {
                 MessageBox.Show("Keine Kinect");
                 return;
             }
             try
             {
-                Runtime r = Runtime.Kinects[0];
-                r.Initialize(RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseDepthAndPlayerIndex);
+                r = KinectSensor.KinectSensors[0];
+                r.Start();
+                //r.Initialize(RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseDepthAndPlayerIndex);
 
                 //r.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(r_VideoFrameReady);
                 //r.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
-
-                r.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(r_DepthFrameReady);
-                r.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);
-                r.SkeletonEngine.TransformSmooth = true;
-                r.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(r_SkeletonFrameReady);
-                _cam = r.NuiCamera;
+                //r.DepthFrameReady += r_DepthFrameReady;
+                //r.DepthStream.Enable();
+                //r.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);
+                //r.SkeletonFrameReady += r_SkeletonFrameReady;
+                r.SkeletonStream.Enable(new TransformSmoothParameters() { Smoothing = 0.1f });
+                //r.SkeletonEngine.TransformSmooth = true;
+                //r.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(r_SkeletonFrameReady);
+                //_cam = r.NuiCamera;
+                //r.AllFramesReady += R_AllFramesReady;
+                r.SkeletonFrameReady += this.r_SkeletonFrameReady;
             }
             catch (Exception ex)
             {
@@ -54,46 +66,118 @@ namespace Demo1
             }
         }
 
+        /*private void R_AllFramesReady(object sender, AllFramesReadyEventArgs e)
+        {
+            if(r == null)
+            {
+                return;
+            }
+            bool depthReceived = false;
+            bool colorReceived = false;
+
+            using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
+            {
+                if (null != depthFrame)
+                {
+                    // Copy the pixel data from the image to a temporary array
+                    depthFrame.CopyDepthImagePixelDataTo(this.depthPixels);
+
+                    depthReceived = true;
+                    if(!init) { 
+                        this.colorCoordinates = new ColorImagePoint[r.DepthStream.FramePixelDataLength];
+                        init = true;
+                    }
+                }
+            }
+
+            using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
+            {
+                if (null != colorFrame)
+                {
+                    // Copy the pixel data from the image to a temporary array
+                    colorFrame.CopyPixelDataTo(this.colorPixels);
+
+                    colorReceived = true;
+                }
+            }
+
+            if (true == depthReceived)
+            {
+                r.CoordinateMapper.MapDepthFrameToColorFrame(
+                    DepthFormat,
+                    this.depthPixels,
+                    ColorFormat,
+                    this.colorCoordinates);
+
+                // ...
+
+                int depthIndex = x + (y * this.depthWidth);
+                DepthImagePixel depthPixel = this.depthPixels[depthIndex];
+
+                // scale color coordinates to depth resolution
+                int X = colorImagePoint.X / this.colorToDepthDivisor;
+                int Y = colorImagePoint.Y / this.colorToDepthDivisor;
+
+                // depthPixel is the depth for the (X,Y) pixel in the color frame
+            }
+
+        }*/
+
         void r_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
         {
+            SkeletonFrame skf = e.OpenSkeletonFrame();
+            if(skf == null)
+            {
+                return;
+            }
+            Skeleton[] sks = new Skeleton[skf.SkeletonArrayLength];
+            skf.CopySkeletonDataTo(sks);
             this.MainCanvas.Children.Clear();
-            foreach (SkeletonData sk in e.SkeletonFrame.Skeletons)
+            foreach (Skeleton sk in sks)
             {
                 if (sk.TrackingState == SkeletonTrackingState.Tracked)
                 {
-                    this.SetLines(sk);
-                    this.SetPoints(sk);
+                    this.drawPlayer(sk);
+                    
                 }
             }
         }
 
-        private void SetLines(SkeletonData sk)
+        private void drawPlayer(Skeleton sk)
         {
-            JointID[,] id = { 
-                { JointID.Head, JointID.ShoulderCenter }, 
-                { JointID.ShoulderCenter, JointID.ShoulderLeft }, 
-                { JointID.ShoulderCenter, JointID.ShoulderRight },
-                { JointID.ShoulderLeft, JointID.ElbowLeft },
-                { JointID.ShoulderRight, JointID.ElbowRight },
-                { JointID.ElbowLeft, JointID.WristLeft },
-                { JointID.ElbowRight, JointID.WristRight },
-                { JointID.WristLeft, JointID.HandLeft },
-                { JointID.WristRight, JointID.HandRight },
-                { JointID.ShoulderCenter, JointID.Spine },
-                { JointID.Spine, JointID.HipCenter },
-                { JointID.HipCenter, JointID.HipLeft },
-                { JointID.HipCenter, JointID.HipRight },
-                { JointID.HipLeft, JointID.KneeLeft },
-                { JointID.HipRight, JointID.KneeRight },
-                { JointID.KneeLeft, JointID.AnkleLeft },
-                { JointID.KneeRight, JointID.AnkleRight },
-                { JointID.AnkleLeft, JointID.FootLeft },
-                { JointID.AnkleRight, JointID.FootRight }
+            this.SetPoints(sk);
+            this.SetLines(sk);
+        }
+
+        private void SetLines(Skeleton sk)
+        {
+            JointType[,] id = { 
+                { JointType.Head, JointType.ShoulderCenter }, 
+                { JointType.ShoulderCenter, JointType.ShoulderLeft }, 
+                { JointType.ShoulderCenter, JointType.ShoulderRight },
+                { JointType.ShoulderLeft, JointType.ElbowLeft },
+                { JointType.ShoulderRight, JointType.ElbowRight },
+                { JointType.ElbowLeft, JointType.WristLeft },
+                { JointType.ElbowRight, JointType.WristRight },
+                { JointType.WristLeft, JointType.HandLeft },
+                { JointType.WristRight, JointType.HandRight },
+                { JointType.ShoulderCenter, JointType.Spine },
+                { JointType.Spine, JointType.HipCenter },
+                { JointType.HipCenter, JointType.HipLeft },
+                { JointType.HipCenter, JointType.HipRight },
+                { JointType.HipLeft, JointType.KneeLeft },
+                { JointType.HipRight, JointType.KneeRight },
+                { JointType.KneeLeft, JointType.AnkleLeft },
+                { JointType.KneeRight, JointType.AnkleRight },
+                { JointType.AnkleLeft, JointType.FootLeft },
+                { JointType.AnkleRight, JointType.FootRight }
             };
             for (int i = 0; i < id.Length / 2; i++)
             {
                 Joint r1 = sk.Joints[id[i, 0]].ScaleTo(640, 480);
                 Joint r2 = sk.Joints[id[i, 1]].ScaleTo(640, 480);
+
+                /**** */
                 Line l = new Line();
                 l.Stroke = Brushes.Blue;
                 l.StrokeThickness = 5.0;
@@ -101,11 +185,13 @@ namespace Demo1
                 l.X1 = r1.Position.X;
                 l.Y2 = r2.Position.Y;
                 l.X2 = r2.Position.X;
+                /**** */
+
                 this.MainCanvas.Children.Add(l);
             }
         }
 
-        private void SetPoints(SkeletonData sk)
+        private void SetPoints(Skeleton sk)
         {
             foreach (Joint joint in sk.Joints)
             {
@@ -121,28 +207,37 @@ namespace Demo1
             }
         }
 
-        void r_DepthFrameReady(object sender, ImageFrameReadyEventArgs e)
+        /*void r_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
         {
-            PlanarImage img = e.ImageFrame.Image;
-            byte[] bh = cv.ConvertDepthFrameWithUser(img.Bits);
-            imgDepth.Source = BitmapSource.Create(img.Width, img.Height,
-            96, 96, PixelFormats.Bgr32, null,
-            bh, img.Width * 4);
+            //PlanarImage img = e.ImageFrame.Image;
+            DepthImageFrame img = e.OpenDepthImageFrame();
+            if(img == null)
+            {
+                return;
+            }
+            DepthImagePixel[] bs = new DepthImagePixel[img.PixelDataLength];
+            img.CopyDepthImagePixelDataTo(bs);
+            byte[] bh = cv.ConvertDepthFrameWithUser(bs, img.Width, img.Height);
+            imgDepth.Source = BitmapSource.Create(img.Width, img.Height, 96, 96, PixelFormats.Bgr32, null, bh, img.Width * 4);
             //bh = cv.ConvertDepthFrameHiddenPlayer(img.Bits);
             //byte[] bh = cv.ConvertDepthFrame(img.Bits);
             //imgDepthPlayer.Source = BitmapSource.Create(img.Width, img.Height,
             //    96, 96, PixelFormats.Bgr32, null,
             //    bh, img.Width * 4);
-        }
+        }*/
 
         private void Window_KeyUp(object sender, KeyEventArgs e)
         {
             try
             {
-                if (e.Key == Key.OemPlus)
-                    _cam.ElevationAngle += 1;
-                if (e.Key == Key.OemMinus)
-                    _cam.ElevationAngle -= 1;
+                if (e.Key == Key.Up)
+                {
+                    int k = r.ElevationAngle;
+                    k++;
+                    r.ElevationAngle = k;
+                }
+                if (e.Key == Key.Down)
+                    r.ElevationAngle -= 1;
             }
             catch (ArgumentOutOfRangeException outOfRangeException)
             {
diff --git a/Demo1/Demo1/SkeletalCommonExtensions.cs b/Demo1/Demo1/SkeletalCommonExtensions.cs
index 2f5b2b3..445f250 100644
--- a/Demo1/Demo1/SkeletalCommonExtensions.cs
+++ b/Demo1/Demo1/SkeletalCommonExtensions.cs
@@ -1,4 +1,5 @@
-using Microsoft.Research.Kinect.Nui;
+using Microsoft.Kinect;
+using System.Windows;
 
 namespace Demo1
 {
@@ -6,17 +7,15 @@ namespace Demo1
     {
         public static Joint ScaleTo(this Joint joint, int width, int height, float skeletonMaxX, float skeletonMaxY)
         {
-            Vector pos = new Vector()
+            SkeletonPoint pos = new SkeletonPoint()
             {
                 X = Scale(width, skeletonMaxX, joint.Position.X),
                 Y = Scale(height, skeletonMaxY, -joint.Position.Y),
-                Z = joint.Position.Z,
-                W = joint.Position.W
+                Z = joint.Position.Z
             };
 
             Joint j = new Joint()
             {
-                ID = joint.ID,
                 TrackingState = joint.TrackingState,
                 Position = pos
             };