Kinect Not Showing Color Image

Go To StackoverFlow.com

3

So i have added the coding4fun and microsoft sources and even done what is in the kinect sdk for displaying the kinect image frame on the screen, but for some reason it wont show, i works on the sdk though
Code I've Written

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.Research.Kinect.Nui;
using Coding4Fun.Kinect.Wpf;
using System.Net.Mail;
using System.IO;
using System.ComponentModel;

namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    Runtime nui;

    int PersonDetected = 0;
    int totalFrames = 0;
    int lastFrames = 0;
    DateTime lastTime = DateTime.MaxValue;

    Dictionary<JointID, Brush> jointColors = new Dictionary<JointID, Brush>() { 
        {JointID.HipCenter, new SolidColorBrush(Color.FromRgb(169, 176, 155))},
        {JointID.Spine, new SolidColorBrush(Color.FromRgb(169, 176, 155))},
        {JointID.ShoulderCenter, new SolidColorBrush(Color.FromRgb(168, 230, 29))},
        {JointID.Head, new SolidColorBrush(Color.FromRgb(200, 0,   0))},
        {JointID.ShoulderLeft, new SolidColorBrush(Color.FromRgb(79,  84,  33))},
        {JointID.ElbowLeft, new SolidColorBrush(Color.FromRgb(84,  33,  42))},
        {JointID.WristLeft, new SolidColorBrush(Color.FromRgb(255, 126, 0))},
        {JointID.HandLeft, new SolidColorBrush(Color.FromRgb(215,  86, 0))},
        {JointID.ShoulderRight, new SolidColorBrush(Color.FromRgb(33,  79,  84))},
        {JointID.ElbowRight, new SolidColorBrush(Color.FromRgb(33,  33,  84))},
        {JointID.WristRight, new SolidColorBrush(Color.FromRgb(77,  109, 243))},
        {JointID.HandRight, new SolidColorBrush(Color.FromRgb(37,   69, 243))},
        {JointID.HipLeft, new SolidColorBrush(Color.FromRgb(77,  109, 243))},
        {JointID.KneeLeft, new SolidColorBrush(Color.FromRgb(69,  33,  84))},
        {JointID.AnkleLeft, new SolidColorBrush(Color.FromRgb(229, 170, 122))},
        {JointID.FootLeft, new SolidColorBrush(Color.FromRgb(255, 126, 0))},
        {JointID.HipRight, new SolidColorBrush(Color.FromRgb(181, 165, 213))},
        {JointID.KneeRight, new SolidColorBrush(Color.FromRgb(71, 222,  76))},
        {JointID.AnkleRight, new SolidColorBrush(Color.FromRgb(245, 228, 156))},
        {JointID.FootRight, new SolidColorBrush(Color.FromRgb(77,  109, 243))}
    };

   private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        if (Runtime.Kinects.Count == 0)
        {
            MessageBox.Show("No Kinect Detected");
        }

        else
        {
            nui = Runtime.Kinects[0];

            nui.Initialize(RuntimeOptions.UseColor | RuntimeOptions.UseSkeletalTracking);

            lastTime = DateTime.Now;

            nui.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_VideoFrameReady);
            nui.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(nui_SkeletonFrameReady);
            //nui.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_DepthFrameReady);

            nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
            //nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution640x480, ImageType.DepthAndPlayerIndex);
        }
    }
    void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
    {
        //KinectImage.Source = e.ImageFrame.ToBitmapSource();
        PlanarImage Image = e.ImageFrame.Image;
        ++totalFrames;

        {
            string bb1 = Convert.ToString(DateTime.Now);
            string filename = "C:\\Kinected\\Kinect1_Image " + bb1 + ".jpg";

            KinectImage.Source = BitmapSource.Create(
                Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, Image.Bits, Image.Width * Image.BytesPerPixel);

            BitmapSource image = BitmapSource.Create(
                Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, Image.Bits, Image.Width * Image.BytesPerPixel);

            if (PersonDetected == 1)
            {
                image.Save(filename, Coding4Fun.Kinect.Wpf.ImageFormat.Jpeg);
                SendNotificationEmail();
                PersonDetected = 0;
            }
        }
    }

Skeletal Sample Code

 using System;
 using System.Net.Mail;
 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.Research.Kinect.Nui;
 using Coding4Fun.Kinect.WinForm;
 using Coding4Fun.Kinect.Wpf;
 using System.IO;
 using System.ComponentModel;


 namespace SkeletalViewer
{
 /// <summary>
 /// Interaction logic for MainWindow.xaml
 /// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    Runtime nui;
   // public int ElevationAngle { get; set; }
     //   public static readonly int ElevationMaximum;
       // public static readonly int ElevationMinimum;
        //public static readonly int ElevationMedian;
        //int ElevationMedian = ElevationAngle == 0;
    int totalFrames = 0;
    int totalFrames2 = 0;
    int lastFrames = 0;
    int PersonDetected = 0;
    DateTime lastTime = DateTime.MaxValue;

    // We want to control how depth data gets converted into false-color data
    // for more intuitive visualization, so we keep 32-bit color frame buffer versions of
    // these, to be updited whenever we receive and process a 16-bit frame.
    const int RED_IDX = 2;
    const int GREEN_IDX = 1;
    const int BLUE_IDX = 0;
    byte[] depthFrame32 = new byte[320 * 240 * 4];



    Dictionary<JointID,Brush> jointColors = new Dictionary<JointID,Brush>() { 
        {JointID.HipCenter, new SolidColorBrush(Color.FromRgb(169, 176, 155))},
        {JointID.Spine, new SolidColorBrush(Color.FromRgb(169, 176, 155))},
        {JointID.ShoulderCenter, new SolidColorBrush(Color.FromRgb(168, 230, 29))},
        {JointID.Head, new SolidColorBrush(Color.FromRgb(200, 0,   0))},
        {JointID.ShoulderLeft, new SolidColorBrush(Color.FromRgb(79,  84,  33))},
        {JointID.ElbowLeft, new SolidColorBrush(Color.FromRgb(84,  33,  42))},
        {JointID.WristLeft, new SolidColorBrush(Color.FromRgb(255, 126, 0))},
        {JointID.HandLeft, new SolidColorBrush(Color.FromRgb(215,  86, 0))},
        {JointID.ShoulderRight, new SolidColorBrush(Color.FromRgb(33,  79,  84))},
        {JointID.ElbowRight, new SolidColorBrush(Color.FromRgb(33,  33,  84))},
        {JointID.WristRight, new SolidColorBrush(Color.FromRgb(77,  109, 243))},
        {JointID.HandRight, new SolidColorBrush(Color.FromRgb(37,   69, 243))},
        {JointID.HipLeft, new SolidColorBrush(Color.FromRgb(77,  109, 243))},
        {JointID.KneeLeft, new SolidColorBrush(Color.FromRgb(69,  33,  84))},
        {JointID.AnkleLeft, new SolidColorBrush(Color.FromRgb(229, 170, 122))},
        {JointID.FootLeft, new SolidColorBrush(Color.FromRgb(255, 126, 0))},
        {JointID.HipRight, new SolidColorBrush(Color.FromRgb(181, 165, 213))},
        {JointID.KneeRight, new SolidColorBrush(Color.FromRgb(71, 222,  76))},
        {JointID.AnkleRight, new SolidColorBrush(Color.FromRgb(245, 228, 156))},
        {JointID.FootRight, new SolidColorBrush(Color.FromRgb(77,  109, 243))}
    };



    private void Window_Loaded(object sender, EventArgs e)
    {
        nui = new Runtime();

        try
        {
            nui.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseColor);
        }
        catch (InvalidOperationException)
        {
            System.Windows.MessageBox.Show("Runtime initialization failed. Please make sure Kinect device is plugged in.");
            return;
        }


        try
        {
            nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
            nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.DepthAndPlayerIndex);
        }
        catch (InvalidOperationException)
        {
            System.Windows.MessageBox.Show("Failed to open stream. Please make sure to specify a supported image type and resolution.");
            return;
        }

        if (Runtime.Kinects.Count < 2)
        {

            lastTime = DateTime.Now;

            nui.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_DepthFrameReady);
            nui.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(nui_SkeletonFrameReady);
            nui.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_ColorFrameReady2);
        }

        if (Runtime.Kinects.Count == 2)
        {
            lastTime = DateTime.Now;

            nui.DepthFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_DepthFrameReady);
            nui.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(nui_SkeletonFrameReady);
            nui.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_ColorFrameReady2);
            nui.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_ColorFrameReady3);
        }
    }

    // Converts a 16-bit grayscale depth frame which includes player indexes into a 32-bit frame
    // that displays different players in different colors
    byte[] convertDepthFrame(byte[] depthFrame16)
    {
        for (int i16 = 0, i32 = 0; i16 < depthFrame16.Length && i32 < depthFrame32.Length; i16 += 2, i32 += 4)
        {
           // 
           // System.Windows.MessageBox.Show(depthFrame16);
            int player = depthFrame16[i16] & 0x07;
            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;
            }
           // file_dist.Close();
        }

       // Console.WriteLine(depthFrame32);

        return depthFrame32;
    }

    void nui_ColorFrameReady(object sender, ImageFrameReadyEventArgs e)
    {
        // 32-bit per pixel, RGBA image
        PlanarImage Image = e.ImageFrame.Image;
        ++totalFrames;
        string bb1 = Convert.ToString(totalFrames);
        // string file_name_3 = "C:\\Research\\Kinect\\Proposal\\Depth_Img" + bb1 + ".jpg"; xxx
        string file_name_4 = "C:\\temp\\Video_Img" + bb1 + ".jpg";
        video.Source = BitmapSource.Create(
            Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, Image.Bits, Image.Width * Image.BytesPerPixel);

                BitmapSource image4 = BitmapSource.Create(
                    Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, Image.Bits, Image.Width * Image.BytesPerPixel);
          //      image4.Save(file_name_4, Coding4Fun.Kinect.Wpf.ImageFormat.Jpeg);

    }

    void nui_ColorFrameReady2(object sender, ImageFrameReadyEventArgs e)
    {
        // 32-bit per pixel, RGBA image  xxx
        PlanarImage Image = e.ImageFrame.Image;
        //int deltaFrames = totalFrames - lastFrameWithMotion;
        //if (totalFrames2 <= stopFrameNumber & deltaFrames > 300)
        {
           ++totalFrames2;
            string bb1 = Convert.ToString(totalFrames2);
            // string file_name_3 = "C:\\Research\\Kinect\\Proposal\\Depth_Img" + bb1 + ".jpg"; xxx
            string file_name_4 = "C:\\Kinected\\Kinect1_Img" + bb1 + ".jpg";
            video.Source = BitmapSource.Create(
                Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, Image.Bits, Image.Width * Image.BytesPerPixel);

            BitmapSource image4 = BitmapSource.Create(
                Image.Width, Image.Height, 96, 96, PixelFormats.Bgr32, null, Image.Bits, Image.Width * Image.BytesPerPixel);

            if (PersonDetected == 1)
            {
                if (totalFrames2 % 10 == 0)
                {
                    image4.Save(file_name_4, Coding4Fun.Kinect.Wpf.ImageFormat.Jpeg);
                    SendNotificationEmail();
                    PersonDetected = 0;
                    // lastFrameWithMotion = totalFrames;
                    // topFrameNumber += 100;
                }
            }
        }

    }

Any ideas about why it isnt displaying the image on my application?

2012-04-04 03:04
by Kuan Mcinrioy
Why are you using the old Kinect SDK? The new version is much easier to implement. Download it from here. Then you can follow these fantastic tutorialsbenjgorman 2012-04-04 03:17


2

Do what benjgorman said, if your using an xbox kinect, it will still work with the new sdk. You can get it here. The code feels a bit different from the older programs, but you'll get used to it pretty fast. You can get the tutorials i used from here, or use the code i provided, make sure that you add the sources Microsoft.Kinect and add the project from the kinect explorer(you download that via the sdk) Microsoft.Samples.Kinect.WpfViewers and then add that as a source. I would reccomend watching the tutorials as they explain the classes and what you need in the SDK
Code

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 System.Net.Mail;
using Coding4Fun.Kinect.Wpf;
using Microsoft.Samples.Kinect.WpfViewers;
using System.Diagnostics;

namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
 private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        kinectSensorChooser1.KinectSensorChanged += new DependencyPropertyChangedEventHandler(kinectSensorChooser1_KinectSensorChanged);
    }

    void kinectSensorChooser1_KinectSensorChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        KinectSensor oldSensor = (KinectSensor)e.OldValue;
        StopKinect(oldSensor);

        KinectSensor newSensor = (KinectSensor)e.NewValue;

        newSensor.ColorStream.Enable();
        newSensor.DepthStream.Enable();
        newSensor.SkeletonStream.Enable();
        newSensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(newSensor_AllFramesReady);
        try
        {
            newSensor.Start();
        }
        catch (System.IO.IOException)
        {
            kinectSensorChooser1.AppConflictOccurred();
        }
    }

    void StopKinect(KinectSensor sensor)
    {
        if (sensor != null)
        {
            sensor.Stop();
            sensor.AudioSource.Stop();
        }
    }

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        StopKinect(kinectSensorChooser1.Kinect);
    }
    void newSensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
    {
        using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
        {
            if (colorFrame == null)
            {
                return;
            }

            byte[] pixels = new byte[colorFrame.PixelDataLength];
            colorFrame.CopyPixelDataTo(pixels);

            int stride = colorFrame.Width * 4;
            video.Source = BitmapSource.Create(
                colorFrame.Width, colorFrame.Height, 96, 96, 
                PixelFormats.Bgr32, null, pixels, stride);
         }
       }

Hope this helps.

2012-04-05 13:09
by Liam McInroy
Thanks, this really helpe - Kuan Mcinrioy 2012-04-05 13:11
Ads