本程序为自己所写,参考素材包括微软官方例子和外文资料,自己做了部分的优化。解释的如果有问题,恳请大家指正.
后台代码:
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" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Closing="Window_Closing" > <Grid Width="512" Height="424"> <Image x:Name="ImageDepth" /> </Grid> </Window>