星期三, 2月 22, 2012

如何使用 Kinect 骨架追蹤(For Windows SDK V1)

Photobucket


透過 Kinect的骨架追蹤功能,我們可以用程式畫出人體骨架,



目前預設模式,可以追蹤出20個骨架關節點,我們可以指定去追蹤特定節點,

例如:左手或右手,判斷手勢,產生相對應的事件,此舉可以有很多應用。



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


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

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

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

Kinect Wpf Viewers 加入工具箱後,

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


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





目前骨架節點如圖所示:
Photobucket


若需更改骨架顯示圖樣等細節修改,可以修改Kinect Wpf Viewers專案裡的

 KinectSkeletonViewer.xaml.cs」。



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


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


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

設定 KinectSkeletonViewer 的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 KinectSkeletonViewer_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);
        }

        void kinectSensorChooser1_KinectSensorChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            KinectSensor old = (KinectSensor)e.OldValue;

            StopKinect(old);

            KinectSensor sensor = (KinectSensor)e.NewValue;

            if (sensor == null)
            {
                return;
            }

            var parameters = new TransformSmoothParameters
            {
                Smoothing = 0.3f,
                Correction = 0.0f,
                Prediction = 0.0f,
                JitterRadius = 1.0f,
                MaxDeviationRadius = 0.5f
            };
            sensor.SkeletonStream.Enable(parameters);

            sensor.SkeletonStream.Enable();
         
            sensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
         
            try
            {
                sensor.Start();
            }
            catch (System.IO.IOException)
            {
                kinectSensorChooser1.AppConflictOccurred();
            }
        }

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

                    //stop audio if not null
                    if (sensor.AudioSource != null)
                    {
                        sensor.AudioSource.Stop();
                    }
                }
              
            }
          
        }
    }
}




 Note: 執行骨架追蹤時,在預設模式下,使用者並須站立,


才能偵測出人體骨架,若使用者採坐姿,系統可能會無法判別,


程式將無法順利畫出人體骨架。


範例程式下載:


4 則留言 :

  1. HI,不好意思,我是最近剛進入KINECT的新手
    可以請教一下如何把KINECT中的骨架圖數據擷取出來並轉成TEXT檔請問可以嗎?
    另外我想請教一下就是數據截取出來時他會有時間序嗎?

    回覆刪除
  2. 謝謝版主這麼熱心提供

    我在摸索過OpenNI、Beta版本後

    因故要摸索新版V1.5

    好多東西V1.0也不是全部都一樣

    好在版主的教學

    總算找到適合自己的玩意

    謝謝大大這麼熱心

    回覆刪除
  3. 不好意思
    HKT版主大
    我有一些KINECT CODE上面的問題
    想要請教您
    方便收個信嗎
    我已經寄信給您了

    回覆刪除
  4. HKT大你好
    我目前在做專題
    想要抓取連續動作的骨架節點的值
    然後將值存在資料庫裡
    大概要從什麼方向著手??
    謝謝你的熱心教學對我專題很有幫助

    回覆刪除

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

關閉廣告 [X]