程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Kinect for Windows SDK開發入門(十八):Kinect Interaction交互控件

Kinect for Windows SDK開發入門(十八):Kinect Interaction交互控件

編輯:C#入門知識

    今年三月份發布了1.7版本的SDK,這一版本的SDK較前一版本最大的變化是添加了Kinect Interactions 和 Kinect Fusion。Kinect Interactions 提供了一些新的帶有姿勢識別的控件如 push-to-press 按鈕, grip-to-pan 列表控件, 而且支持多用戶,同時二個人進行的交互,這些新添加的控件能夠非常方便的集成到應用程序中,極大的簡化了開發和調試過程。

建立必要環境

    創建工程之前,您需要到官網上下載最新的1.7 SDK和Developer Toolkit。首先打開Visual Studio創建一個簡單的WPF桌面應用程序,然後添加Microsoft.Kinect.dll , Kinect.Toolkit.dll, Kinect.Toolkit.Controls.dll和Kinect.Toolkit.Interaction.dll 引用,這些dll一般在安裝目錄下,我的機器上是C:\Program Files\Microsoft SDKs\Kinect\下面。

使用KinectSensorChooser控件初始化Kinect傳感器

    在Microsoft.Kinect.Toolkit.Controls命名空間下,最先用到的控件可能就是KinectSensorChooserUI,它用來指示當前Kinect的工作狀態,提示用戶Kinect傳感器是否工作正常,比如是否斷線,是否插到了錯誤的USB接口上了等等。

   要添加這個控件,首先在主窗體中,添加以下命名空間:


   然後,在主窗體中添加KinectSensorChooserUI控件,代碼如下:


   在cs代碼中,我們需要初始化KinectSensorChooser控件對象:

sensorChooser;

   然後在主窗體的構造函數中注冊OnLoad事件:

MainWindow()
{
    InitializeComponent();
    Loaded += OnLoaded;
}

   創建OnLoaded的委托方法:

OnLoaded(sender, e)
{
    .sensorChooser = ();
    .sensorChooser.KinectChanged += SensorChooserOnKinectChanged;
    .sensorChooserUi.KinectSensorChooser = .sensorChooser;
    .sensorChooser.Start();
}

    如果傳感器的狀態發生改變,比如關閉或者初始化完成,將會觸發SensorChooserOnKinectChanged事件。現在為了演示方便,就用MessageBox彈出提示信息:

SensorChooserOnKinectChanged(sender, args)
{
    .Show(args.NewSensor == ? : args.NewSensor.Status.ToString()); 
}

    現在運行系統。如果沒有將Kinect連接電腦上,您將會看到:

    上面的代碼可以處理舊的Kinect傳感器拔掉,連上新的傳感器並開啟深度和骨骼數據流的情景,在開發中我們可能會同時連接多個傳感器。在try代碼中,我們試圖開啟近景模式,如果用戶采用的xbox傳感器,則不支持,那麼轉到一般的模式下。一般情況下,開啟近景模式方便調試和用戶近距離使用。

二 Kinect交互控件

Kinect Region 控件

    要想使用 Kinect Interaction,需要在界面上添加一個KinectRegion容器類。KinectRegion是WPF中使用Kinect Interaction進行交互的關鍵元素。它是其它Kinect interaction 控件的容器。KinectRegion也負責展示和移動手形圖標,即用戶的手部骨骼點在界面上的展現。應用程序主界面上可以有多個KinectRegion,但是每個KinectRegion不能夠嵌套,每一個KinectRegion中可以有自己的Kinect sensor 對象。

    現在,添加一個KinectRegion對象到主窗體上:


    然後,設置kinectRegion的KinectSensor屬性到我們獲取的kinectSensor上:

(!error)
    kinectRegion.KinectSensor = args.NewSensor;

    如果運行程序,則會提示錯誤:

    KinectUserViewer展示的是人物在Kinect中的深度影像數據,如果看不到影像,那麼表示當前Kinect沒有追蹤到你,這時應當試著移動來讓Kinect追蹤到你。運行程序,還是使用剛才Kinect Studio錄制到的數據,這時您可以看到自己在Kinect視場中的人物深度影像。

    然後在click事件裡面寫一些提示:

ButtonOnClick(sender, e)
{
    .Show();
}

    當我們的手沒有接觸到該控件的時候,他默認為藍色。當手移動到按鈕上時,按鈕會變大,並且手形圖標周圍會出現陰影,以顯示當前處於懸浮狀態。然後我們將手掌像Kinect方向推,會發現手形圖標會根據距離Kinect的距離遠近來產生動畫,表示我們正在產生“壓”按鈕的動作。當達到一定的深度阈值時,表示用戶已經按下按鈕,手形圖標會變色,並且會觸發Click事件。

    重復以上動作,可以看到相似的動畫效果:

    這個控件就像WPF中的標准ScrollViewer一樣。裡面有一個StackPanell用來放置滾動的內容,這兩個控件組合可以使得內容水平滾動,現在在StackPanel中放置一些KinectCircleButtons.

(i = 1; i < 20; i++)
{
    button = {
        Content = i,
        Height = 200
    };

    i1 = i;
    button.Click +=
        (o, args) => .Show(+ i1);

    scrollContent.Children.Add(button);
}

    現在運行程序,如下圖動畫所示,剛開始的時候,可以看到下面的KinectCircleButton;當手移動手到滾動區域,顏色發生變化;然後合上手指,握拳,手勢圖標會發生變化,表示你當前正在對KinectScrollViewer做抓取操作,移動拳頭,KinectScrollViewer控件會把手勢圖標貼到控件上,就像我們的手指在觸摸屏上操作那樣,然後裡面的button會跟著手勢的移動而移動,定位好了之後,放開拳頭,就停止移動,這個時候, 對著想要的按鈕,將手往前壓,就會像前面的控件那樣觸發Click事件。

 結語

    本文簡要介紹了Kinect for Windows 1.7 SDK中引入的Kinect Interactions功能及相關控件,這些具有Kinect屬性的控件極大地簡化了我們將Kinect功能添加到應用程序中去的難度,使得我們能夠通過Kinect更快更好的創建炫酷的Kinect應用程序。本文的代碼點擊此處下載,由於大小關系,代碼中沒有放置KinectInteraction170_32.dll或者KinectInteraction170_64.dll 這兩個dll,您自己安裝SDK後拷貝到對應目錄下運行即可,希望本文對您了解1.7 版 SDK 中的Kinect Interactions 相關控件有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved