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