如何使用 Kinect 彩色+深度影像 (For Windows SDK V1)

這一篇文章,沉了好久,好像應該浮出來了!!!
「如何同時使用 Kinect 彩色影像+深度影像」,
這問題似乎是前三名問題,
更新一下目前收到的問題排名:
1.如何同時使用 Kinect 彩色影像+深度影像<=今天解決掉
2.如何使用 Kinect 深度影像,依深度不同分別染上不同顏色<=未來KT會補上
3.如何使用 Kinect 辨識判斷手勢動作<=KT已發文說明,所以瞬間大降,但還是有零星問題><
所以今天我們來看一下這個,
還是一樣老問題,KT還是要碎嘴念一下,
拜託大家!!! 看一下說明書!!!
說明書寫得真的很精彩,像一本武功絕學一樣,
要學Kinect 武功,怎能棄而不視呢???
(那怕他是天書、蚯蚓文也要翻箱倒櫃,查字典把它弄懂)
KT還是一樣,翻一下說明書,引經據典給大家看一下:

基本馬步問題,這一本都有解答喔!!!
回到正題,「如何同時使用 Kinect 彩色影像+深度影像」
這問題很可愛喔!!!
彩色影像會用、深度影像會用,但是不知道如何同時使用???
可愛吧!!! (lovely~)
因為大家留言或來信都排斥使用 Kinect Wpf Viewers 的控制項,><""",
所以你可以看到,KT後來進階應用文章,
就順應民意,就都不採用Kinect Wpf Viewers控制項,
所以這篇也回歸最原始,自己來~不用控制項來做!!!
我們先來複習一下怎麼使用彩色影像吧!!!
說明書可以翻到(搜尋關鍵字:Color Viewer C# How To)這裡:

建立彩色影像步驟:
1.宣告一台Kinect
2.開啟彩色影像功能
3.開啟Kinect裝置
4.處理彩色影像函數,將擷取到的像素轉成點陣圖(Bitmap),
然後將這張點陣圖在秀在Image控制項上。
也複習一下怎麼使用深度影像吧!!!
說明書可以翻到(搜尋關鍵字:Depth Viewer C# How To)這裡:

建立深度影像步驟:
1.宣告一台Kinect
2.開啟深度影像功能
3.開啟Kinect裝置
4.處理深度影像函數,將擷取到的像素轉成點陣圖(Bitmap),
然後將這張點陣圖在秀在Image控制項上。
那...「如何同時使用 Kinect 彩色影像+深度影像」???
建立彩色影像+深度影像步驟:
1.宣告一台Kinect
2.開啟"彩色影像"與"深度影像"功能
3.開啟Kinect裝置
4.處理"彩色影像"函數,將擷取到的像素轉成點陣圖(Bitmap),
然後將這張點陣圖在秀在Image控制項上。
5.處理"深度影像"函數,將擷取到的像素轉成點陣圖(Bitmap),
然後將這張點陣圖在秀在Image控制項上。
各位老大們!!! 蹲馬步的問題,下次就饒了KT吧!!!
這一次KT的程式畫面:

左邊彩色影像、右邊深度影像,下方各有勾勾確認框,
初始都是打勾分別開啟彩色和深度影像,
若取消勾勾則會關閉(Disable)功能,
再打勾則會再開啟(Enable)功能。
影片教學:
將建立彩色影像+深度影像步驟概念轉成程式碼如下:
XAML CODE 完整程式碼:
C# 完整程式碼:![]()
![]()
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Kinect;
namespace KinectVideoAndDepth_Demo
{
public partial class MainWindow : Window
{
//===變數宣告區===
KinectSensor sensor = KinectSensor.KinectSensors[0];
byte[] Color_pixelData;
short[] Depth_pixelData;
public MainWindow()
{
InitializeComponent();
//註冊視窗"載入"與"卸載"事件
this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
this.Unloaded += new RoutedEventHandler(MainWindow_Unloaded);
//開啟彩色影像功能
sensor.ColorStream.Enable();
Color_checkBox.IsChecked=true;
//開啟深度影像功能
sensor.DepthStream.Enable();
Depth_checkBox.IsChecked = true;
}
//視窗開啟事件
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
sensor.Start();//開啟Kinect裝置
sensor.ColorFrameReady += runtime_VideoFrameReady;//處理彩色影像函數
sensor.DepthFrameReady += sensor_DepthFrameReady;//處理深度影像函數
}
//視窗關閉事件
void MainWindow_Unloaded(object sender, RoutedEventArgs e)
{
sensor.Stop();
}
//處理彩色影像函數
void runtime_VideoFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
bool receivedData = false;
using (ColorImageFrame CFrame = e.OpenColorImageFrame())
{
if (CFrame == null)
{
// The image processing took too long. More than 2 frames behind.
}
else
{
Color_pixelData = new byte[CFrame.PixelDataLength];
CFrame.CopyPixelDataTo(Color_pixelData);
receivedData = true;
}
}
if (receivedData)
{
BitmapSource source = BitmapSource.Create(640, 480, 96, 96,
PixelFormats.Bgr32, null, Color_pixelData, 640 * 4);
videoImage.Source = source;
}
}
//處理深度影像函數
void sensor_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
bool receivedData = false;
using (DepthImageFrame DFrame = e.OpenDepthImageFrame())
{
if (DFrame == null)
{
// The image processing took too long. More than 2 frames behind.
}
else
{
Depth_pixelData = new short[DFrame.PixelDataLength];
DFrame.CopyPixelDataTo(Depth_pixelData);
receivedData = true;
}
}
if (receivedData)
{
BitmapSource source = BitmapSource.Create(640, 480, 96, 96,
PixelFormats.Gray16, null, Depth_pixelData, 640 * 2);
depthImage.Source = source;
}
}
//彩色影像啟動確認框
private void Color_checkBox_Click(object sender, RoutedEventArgs e)
{
if (Color_checkBox.IsChecked == true)
{
MessageBox.Show("開啟彩色影像功能");
sensor.ColorStream.Enable();
}
else
{
MessageBox.Show("關閉彩色影像功能");
sensor.ColorStream.Disable();
}
}
//深度影像啟動確認框
private void Depth_checkBox_Click(object sender, RoutedEventArgs e)
{
if (Depth_checkBox.IsChecked == true)
{
MessageBox.Show("開啟深度影像功能");
sensor.DepthStream.Enable();
}
else
{
MessageBox.Show("關閉深度影像功能");
sensor.DepthStream.Disable();
}
}
}
}
範例程式碼下載:相關文章參考:
HKT線上教學教室 - Kinect 教學目錄