星期三, 2月 22, 2012

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

Photobucket


透過 Kinect的距離量測功能,可以有多層次的深度影像,

可過濾掉背景影像或將背景塗黑,只留下使用者(Player)的影像。


目前SDK 正式版 V1,提供了一組 Kinect工具,


工具名稱為Kinect Wpf Viewers,方便使用者操作Kinect。

而如何在工具箱裡,加入這套控制項可以參考 KT這一篇:

如何在工具箱裡,加入Kinect Wpf Viewers 7個控制項 




Kinect Wpf Viewers 加入工具箱後,

這次我們需要使用其中兩個控制項 「KinectSensorChooser 」和 


KinectDepthViewer」 ,來實作 Kinect 深度影像。
Photobucket


目前顏色與距離關係表示如圖:
Photobucket







若需更改每段距離的顏色的表現,可以修改Kinect Wpf Viewers專案裡的

 KinectDepthViewer .xaml.cs」。


距離和幾位使用者計算公式:
Photobucket






開啟Visual Studio 2010 建立一個Kinect專案後,


在設計畫面中加入「KinectSensorChooser 」和 KinectDepthViewer」 。


設定KinectDepthViewer 寬度和高度Width=320和Height=240,

設定KinectDepthViewer 的Kinect 屬性,資料繫結到 KinectSensorChooser。
(詳細圖文步驟可參考: 如何使用 Kinect 彩色影像 (For Windows SDK V1),類似的作法)

再來只要加入,開啟深度影像功能相關事件即可完成。


結果展示:


XAML 程式碼如下:


    
        
        
    


C# 程式碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Kinect;

namespace KinectDepthViewer_Demo
{
    /// 
    /// MainWindow.xaml 的互動邏輯
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            kinectSensorChooser1.KinectSensorChanged += new DependencyPropertyChangedEventHandler(kinectSensorChooser1_KinectSensorChanged);
        }
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            StopKinect(kinectSensorChooser1.Kinect);
        }

        void kinectSensorChooser1_KinectSensorChanged(object sender, DependencyPropertyChangedEventArgs e)
        {

            var oldSensor = (KinectSensor)e.OldValue;

            //關閉舊的 Kinect
            if (oldSensor != null)
            {
                oldSensor.Stop();
                oldSensor.AudioSource.Stop();
            }

            //開啟新的 Kinect
            var newSensor = (KinectSensor)e.NewValue;
            if (newSensor == null)
            {
                return;
            }

            //開啟深度影像功能
            newSensor.DepthStream.Enable(DepthImageFormat.Resolution320x240Fps30);
            newSensor.SkeletonStream.Enable();

            try
            {
                newSensor.Start();
            }
            catch (System.IO.IOException)
            {
                //this happens if another app is using the Kinect
                kinectSensorChooser1.AppConflictOccurred();
            }
        }    

        private void StopKinect(KinectSensor sensor)
        {
            if (sensor != null)
            {
                if (sensor.IsRunning)
                {
                    //關閉 Kinect
                    sensor.Stop();

                    //關閉 AudioSource
                    if (sensor.AudioSource != null)
                    {
                        sensor.AudioSource.Stop();
                    }
                }
            }
        } 
    }
}







範例程式下載:


16 則留言 :

  1. 您好

    想請問一下

    雖然已經利用tool取得了深度影像

    但是該如何將深度影像中的data也給取出

    以及sample中 當偵測到使用者後,使用者的顏色改變的data

    回覆刪除
  2. Hi Mr.Chen,

    因為是使用tool工具取得深度影像,

    所以要更改細節設定,

    可以至tool的source code,

    更改你所需要的程式。

    PS.更改tool的source code前,要記得備份喔!!!

    tool 專案為 Microsoft.Samples.Kinect.WpfViewers,

    有關深度影像的程式碼細節修改,

    可以修改專案裡的 "KinectDepthViewer.xaml.cs"

    你可以在此檔,搜尋 "white"、"dark purple"或"dark brown"等關鍵字,

    即可看到距離與顏色的定義。

    供您參考~

    回覆刪除
  3. 那請問一下

    如果不使用 tool 的話

    要如何呼叫出深度影像

    小弟寫了好了depth的initial

    也將自己想要的RGB都輸入了

    問題是如果要顯示在WPF的image這個tool中

    該如何設定

    懇請大大指教!!

    回覆刪除
  4. 附上小弟寫的code

    http://ideone.com/pY9tR

    回覆刪除
  5. Hi Mr.Chen,

    你可以參考這篇,不使用控制項(tool),來建立Kinect專案:
    http://tw-hkt.blogspot.com/2012/02/kinect-for-windows-sdk-v1.html

    文章下方也附有:深度影像的完整範例程式碼

    供您參考~

    回覆刪除
  6. 你好~
    我很好奇pixelData 陣列中印出來的值,是代表甚麼意義,我要如何可以將之前測試版的SDK中有個距離轉換不同距離顏色不一樣的範例

    回覆刪除
  7. 回樓上這一位朋友(翊起分享一世界),

    pixelData定義,

    在官方說明書裡:「Kinect For Windows SDK V1 程式指南手冊」,

    已由很詳細的說明囉!!!

    KT 這邊建議,一定要K過手冊喔!!!

    pixelData:

    代表每個像素,其中資料包含X和Y座標與Kinect物件的相對距離。

    更多詳細資料定義,可參考官方手冊。

    回覆刪除
  8. 回樓上這一位朋友(翊起分享一世界),

    如何將舊版(Beta2 )範例移植至新版(v1.0)的程式,

    可參考這篇
    Kinect for Windows – Code Migration from Beta2 to v1.0 (C#/VB):
    http://goo.gl/fq2RP

    裡面有表格詳細記載說明,相對應的API更改方式。

    回覆刪除
  9. KT大大您好!
    不好意思我又有個小問題要問您了
    如果我想在一個專案裡同時放入彩色影像和深度質影像
    要怎麼做呢?
    謝謝

    回覆刪除
  10. 哈囉~阿竹,

    這篇應該可以解決你的問題:

    如何使用 Kinect 彩色+深度影像 (For Windows SDK V1)
    http://tw-hkt.blogspot.com/2012/04/kinect-for-windows-sdk-v1.html

    回覆刪除
  11. KT大您好
    最近在研kinect的深度影像
    想要修改深度影響的顏色 發現更改數據之後 顏色還是沒改變
    也想更改顯示視窗大小 改成了640*480 也沒有改變@@
    附上 修改的程式碼 請KT大大過目一下@@ 是缺少了甚麼關鍵的原始碼嗎@@
    if (player == 0 && realDepth == 0)
    {
    // white
    this.depthFrame32[i32 + RedIndex] = 255;
    this.depthFrame32[i32 + GreenIndex] = 0;
    this.depthFrame32[i32 + BlueIndex] = 0;
    }
    else if (player == 0 && realDepth == tooFarDepth)
    {
    // dark purple
    this.depthFrame32[i32 + RedIndex] = 0;
    this.depthFrame32[i32 + GreenIndex] = 255;
    this.depthFrame32[i32 + BlueIndex] = 0;
    }
    else if (player == 0 && realDepth == unknownDepth)
    {
    // dark brown
    this.depthFrame32[i32 + RedIndex] = 0;
    this.depthFrame32[i32 + GreenIndex] = 0;
    this.depthFrame32[i32 + BlueIndex] = 255;

    視窗大小的部分


    改了都沒反應QQ
    感謝觀看~

    回覆刪除
  12. 視窗大小的部分

    my:KinectDepthViewer HorizontalAlignment="Left" Name="kinectDepthViewer1" VerticalAlignment="Top" Height="480" Width="640" Kinect="{Binding ElementName=kinectSensorChooser1, Path=Kinect}" Margin="0,-14,0,0"

    回覆刪除
  13. 抱歉問一個比較愚昧的問題
    kinect depth image 影像 有兩個人形 應該是兩個鏡頭為了取dpeth所導致的吧?
    還是我理解錯誤呢?
    感謝您的回答^^

    回覆刪除
  14. KT大你好~!
    我想請問一下kinect可以拍出有深度的功能嗎??像是人的腳.....等~!

    回覆刪除
  15. 想請問一下KT 大大!!

    要怎麼樣把 彩色 深度 骨架 放在同一個專案裡面呢?

    回覆刪除

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

關閉廣告 [X]