星期五, 4月 13, 2012

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

5 則留言 :

  1. KT您好
    很謝謝您的這篇文章!
    非常抱歉我真的沒有好好讀過說明文件就問一些很基礎的問題
    看過這篇文章才發現它的重要性
    我一定會去好好的看過它
    真的非常謝謝您^^

    回覆刪除
  2. 您好:
    請問可以示範畫出骨架嗎?
    謝謝!

    yx

    回覆刪除
  3. 哈囉~YX,

    可以參考這篇文章:
    如何使用 Kinect 骨架追蹤(For Windows SDK V1)
    http://tw-hkt.blogspot.com/2012/02/kinect-for-windows-sdk-v1_1798.html

    回覆刪除
  4. 不好意思,在這邊想請問KT!
    關於您這次製作的深度影像我發現在您比YA的時候,您的YA旁邊還會多跑出個YA.
    我在製作的時候也會發生這個問題,因為我現在製作專題要將深度及原始影像利用
    程式轉成多個視角的影片,所以必須使用精確的深度影片,去網路上尋找後發現大部
    份的深度圖像都是這個結果,不知道KT有沒有辦法能幫小弟解決呢??

    回覆刪除
  5. KT 大大我反而不會 骨架追蹤與彩色影像一起做結合,我把兩種的範例加在一起,執行後,骨架反而不能動,影像也沒有輸出出來,請問可以提供教學嗎?

    回覆刪除

回覆意見時,麻煩輸入一下暱稱
(隨便取個名字也好~ ^_^)
好讓我方便回覆您的問題,
選擇「名稱/網址」輸入您的暱稱,
麻煩一下,謝謝大家。

關閉廣告 [X]