[KinectWPF程序]2彩色图像,使用WriteableBitmap对象改进Kinect图像显示&复杂的Kinect初始化方法

来源:互联网 发布:不亦说乎和不亦乐乎 编辑:程序博客网 时间:2024/04/29 21:34

[KinectWPF程序]2彩色图像,使用WriteableBitmap对象改进Kinect图像显示&复杂的Kinect初始化方法

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;/* 改进方法是使用WriteableBitmap对象。 * 它位于System.Windows.Media.Imaging命名空间下面, * 该对象被用来处理需要频繁更新的像素数据。 * 当创建WriteableBitmap时,应用程序需要指定它的高度, * 宽度以及格式,以使得能够一次性为WriteableBitmap创建好内存, * 以后只需根据需要更新像素即可。*/namespace WpfApplication10{    /// <summary>    /// MainWindow.xaml 的交互逻辑    /// </summary>    public partial class MainWindow : Window    {        //私有Kinectsensor对象        private KinectSensor kinect;        private WriteableBitmap colorImageBitMap;        private Int32Rect colorImageBitmapRect;        private int colorImageStride;        public KinectSensor Kinect        {            get { return this.kinect; }            set            {                //如果带赋值的传感器和目前的不一样                if (this.kinect != value)                {                    //如果当前的传感对象不为null                    if (this.kinect != null)                    {                        //uninitailize当前对象                        this.kinect = null;                        UninitializeKinectSensor(this.kinect);                    }                    //如果传入的对象不为空,且状态为连接状态                    if (value != null && value.Status == KinectStatus.Connected)                    {                        this.kinect = value;                        InitializeKinectSensor(this.kinect);                    }                }            }        }        public MainWindow()        {            InitializeComponent();            this.Loaded += (s, e) => DiscoverKinectSensor();            this.Unloaded += (s, e) => this.kinect = null;        }        private void DiscoverKinectSensor()        {            KinectSensor.KinectSensors.StatusChanged += KinectSensors_StatusChanged;            this.Kinect = KinectSensor.KinectSensors.FirstOrDefault(x => x.Status == KinectStatus.Connected);        }        private void KinectSensors_StatusChanged(object sender, StatusChangedEventArgs e)        {            switch (e.Status)            {                case KinectStatus.Connected:                    if (this.kinect == null)                        this.kinect = e.Sensor;                    break;                case KinectStatus.Disconnected:                    if (this.kinect == e.Sensor)                    {                        this.kinect = null;                        this.kinect = KinectSensor.KinectSensors.FirstOrDefault(x => x.Status == KinectStatus.Connected);                        if (this.kinect == null)                        {                            //TODO:通知用于Kinect已拔出                        }                    }                    break;                //TODO:处理其他情况下的状态            }        }        private void InitializeKinectSensor(KinectSensor kinectSensor)        {            if (kinectSensor != null)            {                ColorImageStream colorStream = kinectSensor.ColorStream;                colorStream.Enable();                //创建WriteableBitmap对象,准备接收像素数据                this.colorImageBitMap = new WriteableBitmap(colorStream.FrameWidth, colorStream.FrameHeight,                                                                                96, 96, PixelFormats.Bgr32, null);                this.colorImageBitmapRect = new Int32Rect(0, 0, colorStream.FrameWidth, colorStream.FrameHeight);                this.colorImageStride = colorStream.FrameWidth * colorStream.FrameBytesPerPixel;                ImageShow.Source = this.colorImageBitMap;                kinectSensor.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(kinectSensor_ColorFrameReady);                kinectSensor.Start();            }        }        private void UninitializeKinectSensor(KinectSensor kinectSensor)        {            if (kinectSensor != null)            {                kinectSensor.Stop();                kinectSensor.ColorFrameReady -= new EventHandler<ColorImageFrameReadyEventArgs>(kinectSensor_ColorFrameReady);            }        }        private void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)        {            using (ColorImageFrame frame = e.OpenColorImageFrame())            {                if (frame != null)                {                    byte[] pixelData = new byte[frame.PixelDataLength];                    frame.CopyPixelDataTo(pixelData);                    //关闭每个像素点的蓝色和绿色通道。                    //for循环遍历每个像素,使得i的起始位置重视该像素的第一个字节。                    //由于数据的格式是Bgr32,即RGB32位(一个像素共占4个字节,每个字节8位),                    //所以第一个字节是蓝色通道,第二个是绿色,第三个是红色。                    //循环体内,将第一个和第二个通道设置为0.所以输出的代码中只用红色通道的信息。这是最基本的图像处理。                    for (int i = 0; i < pixelData.Length; i += frame.BytesPerPixel)                    {                        pixelData[i] = 0x25;//蓝色                        pixelData[i + 1] = 0x00;//绿色                    }                    //调用WriteableBitmap对象的WritePixels方法来更新图像                    this.colorImageBitMap.WritePixels(this.colorImageBitmapRect, pixelData, this.colorImageStride, 0);                }            }          }    }}
0 0
原创粉丝点击