如何使用 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 教學目錄