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

Photobucket
這一篇文章,沉了好久,好像應該浮出來了!!!



「如何同時使用 Kinect 彩色影像+深度影像」,

這問題似乎是前三名問題,

更新一下目前收到的問題排名:

1.如何同時使用 Kinect 彩色影像+深度影像<=今天解決掉

2.如何使用 Kinect 深度影像,依深度不同分別染上不同顏色<=未來KT會補上

3.如何使用 Kinect 辨識判斷手勢動作<=KT已發文說明,所以瞬間大降,但還是有零星問題><




所以今天我們來看一下這個,

還是一樣老問題,KT還是要碎嘴念一下,

拜託大家!!! 看一下說明書!!!

說明書寫得真的很精彩,像一本武功絕學一樣,

要學Kinect 武功,怎能棄而不視呢???
(那怕他是天書、蚯蚓文也要翻箱倒櫃,查字典把它弄懂)


KT還是一樣,翻一下說明書,引經據典給大家看一下:
Photobucket


基本馬步問題,這一本都有解答喔!!!



回到正題,「如何同時使用 Kinect 彩色影像+深度影像」

這問題很可愛喔!!!
彩色影像會用、深度影像會用,但是不知道如何同時使用???

可愛吧!!! (lovely~)




因為大家留言或來信都排斥使用 Kinect Wpf Viewers 的控制項,><""",

所以你可以看到,KT後來進階應用文章,

就順應民意,就都不採用Kinect Wpf Viewers控制項,

所以這篇也回歸最原始,自己來~不用控制項來做!!!



我們先來複習一下怎麼使用彩色影像吧!!!

說明書可以翻到(搜尋關鍵字:Color Viewer C# How To)這裡:
Photobucket

建立彩色影像步驟:
1.宣告一台Kinect
2.開啟彩色影像功能
3.開啟Kinect裝置
4.處理彩色影像函數,將擷取到的像素轉成點陣圖(Bitmap),
   然後將這張點陣圖在秀在Image控制項上。




也複習一下怎麼使用深度影像吧!!!
說明書可以翻到(搜尋關鍵字:Depth Viewer C# How To)這裡:
Photobucket
建立深度影像步驟:

1.宣告一台Kinect
2.開啟深度影像功能
3.開啟Kinect裝置
4.處理深度影像函數,將擷取到的像素轉成點陣圖(Bitmap),
   然後將這張點陣圖在秀在Image控制項上。



那...「如何同時使用 Kinect 彩色影像+深度影像」???
建立彩色影像+深度影像步驟:

1.宣告一台Kinect
2.開啟"彩色影像"與"深度影像"功能
3.開啟Kinect裝置
4.處理"彩色影像"函數,將擷取到的像素轉成點陣圖(Bitmap),
   然後將這張點陣圖在秀在Image控制項上。
5.處理"深度影像"函數,將擷取到的像素轉成點陣圖(Bitmap),
   然後將這張點陣圖在秀在Image控制項上。

各位老大們!!! 蹲馬步的問題,下次就饒了KT吧!!!

這一次KT的程式畫面:
Photobucket

左邊彩色影像、右邊深度影像,下方各有勾勾確認框,

初始都是打勾分別開啟彩色和深度影像,

若取消勾勾則會關閉(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 教學目錄

這個網誌中的熱門文章

2023 最新入門零基礎 Kotlin教學【從零開始學 Kotlin 程式設計】Kotlin 教學課程目錄 (Android Kotlin, IntelliJ IDEA, Android Studio, Android APP 開發教學)

最新入門零基礎 Java 教學【從零開始學 Java 程式設計】Java教學課程目錄 (IntelliJ IDEA 開發教學)

nano 文字編輯器

2022 最新入門零基礎 Flutter教學 【Flutter 程式設計入門實戰 30 天】Flutter 教學課程目錄 (IntelliJ IDEA 開發教學)

Android Studio 歷代版本下載點