本程序為自己所寫,參考素材包括微軟官方例子和外文資料,自己做了部分的優化。解釋的如果有問題,懇請大家指正.
後台代碼:
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>