如何使用 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: 執行骨架追蹤時,在預設模式下,使用者並須站立,


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


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


範例程式下載:


這個網誌中的熱門文章

16天記下7000單字

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

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

nano 文字編輯器

【從零開始學 Flutter 程式設計】SharedPreferences 設定檔資料存取