Kinect没有显示彩色图像

时间:2012-04-04 03:04:42

标签: c# wpf rgb kinect

所以我添加了coding4fun和microsoft源代码,甚至完成了kinect sdk中用于在屏幕上显示kinect图像帧的内容,但由于某种原因它不会显示,我在sdk上工作但是 我编写的代码

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;
            }
        }
    }

骨骼样本代码

 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;
                }
            }
        }

    }

关于它为什么不在我的应用程序上显示图像的任何想法?

1 个答案:

答案 0 :(得分:2)

做benjgorman所说的,如果你使用的是xbox kinect,它仍然适用于新的sdk。你可以得到它here。代码感觉与旧程序有点不同,但你会很快习惯它。您可以获得我使用的教程from here,或使用我提供的代码,确保添加源Microsoft.Kinect并从kinect资源管理器添加项目(通过sdk下载){{ 1}}然后将其添加为源。我会建议您观看教程,因为他们会在SDK中解释课程和您需要的内容 的代码

Microsoft.Samples.Kinect.WpfViewers

希望这有帮助。