你的位置:首页 > ASP.net教程

[ASP.net教程]Kinect V2 基础教程之彩色图像


  本程序为自己所写,参考素材包括微软官方例子和外文资料,自己做了部分的优化。本人没有学过图像处理,解释的如果有问题,恳请大家指正.

后台代码:

using System.ComponentModel;using System.Windows;using System.Windows.Media;using System.Windows.Media.Imaging;using Microsoft.Kinect;namespace KinectV2{  /// <summary>  /// MainWindow.xaml   /// </summary>  public partial class MainWindow : Window  {    #region 定义变量    // kinect设备    KinectSensor kinect;    //彩色帧读取    ColorFrameReader colorFrameReader;    //一帧图像的性质描述    FrameDescription colorFrameDesc;    //枚举类型,定义彩色帧的格式(共6种)    //此处规定彩色帧格式为Bgra格式:4字节存储一个像素点,包含blue,green,red,alpha(即像素点亮度值)    ColorImageFormat colorFormat = ColorImageFormat.Bgra;    //创建用于显示图像的位图    WriteableBitmap colorBitmap;    //用于存放一帧彩色图像的所有信息(byte 类型,每个元素占一个字节)     byte[] colorBuffer;    //一帧彩色图像的步长(物理意义:此处表示一帧图像的每一行需占用的字节个数)(作用:渲染位图时需要提供图像的步长)    int colorStride;    //存放彩色图像的矩形画布(作用:渲染位图时需要提供画布位置和大小)    Int32Rect colorRect;    #endregion    public MainWindow()    {      InitializeComponent();      #region 变量初始化、赋值      // 获取默认的kinect传感器      kinect = KinectSensor.GetDefault();      //启动传感器      kinect.Open();      //确定彩色帧的数据类型      colorFrameDesc = kinect.ColorFrameSource.CreateFrameDescription(colorFormat);      // 创建并返回一个新的读取对象      colorFrameReader = kinect.ColorFrameSource.OpenReader();      //触发彩色帧事件      colorFrameReader.FrameArrived += colorFrameReader_FrameArrived;      //彩色位图初始化(96,96表示分辨率,即96像素/英寸)      colorBitmap = new WriteableBitmap(colorFrameDesc.Width, colorFrameDesc.Height, 96, 96, PixelFormats.Bgra32, null);      //图像步长初始化      colorStride = colorFrameDesc.Width * (int)colorFrameDesc.BytesPerPixel;//(int)colorFrameDesc.BytesPerPixel = 4,每个像素点占4字节      //画布矩形框初始化      colorRect = new Int32Rect(0, 0, colorFrameDesc.Width, colorFrameDesc.Height);      //计算总共需要多少个字节才能储存一帧图像的所有像素点      colorBuffer = new byte[colorStride * colorFrameDesc.Height];      //彩色位图和UI界面图片控件关联      ImageColor.Source = colorBitmap;  //即实时的将获取的彩色帧信息描绘在ImageColor控件中      #endregion    }    #region 处理来自传感器的彩色帧 事件    //彩色帧触发事件    void colorFrameReader_FrameArrived(object sender, ColorFrameArrivedEventArgs e)    {      //更新彩色帧,然后描绘彩色帧      UpdateColorFrame(e);      DrawColorFrame();    }    private void UpdateColorFrame(ColorFrameArrivedEventArgs e)    {      // 获取一帧彩色图像      using (var colorFrame = e.FrameReference.AcquireFrame())      {        if (colorFrame == null)        {          return;        }        // 将一帧彩色图像数据以‘colorFormat’格式拷贝放到‘colorBuffer’中        colorFrame.CopyConvertedFrameDataToArray(colorBuffer, colorFormat);      }    }    private void DrawColorFrame()    {      // 将获取的一帧彩色图像数据更新到位图中      colorBitmap.WritePixels(colorRect, colorBuffer, colorStride, 0);    }    #endregion    //程序窗口关闭事件    private void Window_Closing(object sender, CancelEventArgs e)    {      // 释放彩色帧资源      if (colorFrameReader != null)      {        colorFrameReader.Dispose();        colorFrameReader = null;      }      //关闭kinect传感器      if (kinect != null)      {        kinect.Close();        kinect = null;      }    }  }}

XAML界面代码:

<Window x:Class="KinectV2.MainWindow"    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    ="http://schemas.microsoft.com/winfx/2006/xaml"    Closing="Window_Closing" >  <Grid Width="512" Height="424">    <Image x:Name="ImageDepth" />  </Grid></Window>