星期二, 2月 21, 2012

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

Photobucket


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


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

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

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


Kinect Wpf Viewers 加入工具箱後,

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


KinectColorViewer」 ,來實作 Kinect 彩色影像。
Photobucket






首先,我們先開啟Visual Studio 2010 來建立一個Kinect專案,
檔案=>新增=>專案
Photobucket




選擇WPF應用程式=>設定專案名稱=>確定
Photobucket


為這個專案加入「Kinect Wpf Viewers」控制項,詳細步驟可參考,KT這一篇:


加入後,點選KinectSensorChooser 」 控制項,且拖曳至設計畫面中
Photobucket



點選KinectColorViewer」控制項,一樣拖曳至設計畫面中
Photobucket

點選設計畫面中的「KinectColorViewer」控制項,
然後到KinectColorViewer屬性面板,設定Width=320和Height=240
Photobucket




然後在KinectColorViewer屬性面板的搜尋Bar搜尋Kinect設定資料繫結
Photobucket




設定資料繫結,元素為KinectSensorChooser
Photobucket




設定資料繫結,路徑為Kinect
Photobucket


再來只要加入開啟彩色影像串流相關事件即可完成。

結果展示:


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;//引用 Kinect 相關API


namespace KinectColorViewer_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)
        {
            //關閉舊的 Kinect
            var oldSensor = (KinectSensor)e.OldValue;
            if (oldSensor != null)
            {
                StopKinect(oldSensor);
            }

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

            //開啟彩色影像的串流
            newSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
            
            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();
                    }
                }
            }
        }
    }
}


範例程式下載:


更多參考資料:
1.Kinect For Windows SDK V1  程式指南手冊
2.Channel9 Kinect for Windows Quickstart Series - Camera Fundamentals


相關文章參考:
HKT線上教學教室 - Kinect 教學目錄

5 則留言 :

  1. 不好意思~想請問一個小問題
    為什麼要再開啟串流前要先做關閉舊的開啟新的這個動作呢?
    謝謝

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

    這是要防止之前有未關閉的Kinect串流,安全保險的寫法。

    未來可能會有很多Kinect的App,
    不見得大家在使用完,都會乖乖去寫關閉程式時去關閉Kinect串流,
    如果前一個未關閉完善,可能會導致要開啟下一個或其他Kinect的App時會失敗。

    所以保險寫法,開啟串流前,先確認再開啟串流,當使用完,也去關閉串流。

    供你參考~

    回覆刪除
  3. 你好 我是剛接觸Kinect的新手 也沒寫過C#的程式
    我想請問一下 XAML程式碼是什麼用途?跟C#的這個程式有什麼直接相關嗎?

    回覆刪除
  4. XAML定義可以參考維基百科介紹:
    http://zh.wikipedia.org/wiki/XAML

    回覆刪除
  5. 你好,我是嘉棋,是剛接觸kinect的新手,kinect sdk以更新到1.8版了,請問__如何在工具箱裡,加入Kinect Wpf Viewers 7個控制項該怎麼做呢?

    回覆刪除

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

關閉廣告 [X]