總感覺自己前面啰啰嗦嗦寫了好多,卻一直都沒有使用用開發kinect的重型武器——Visual Studio。
那么本次我們就借助于Visual Studio,寫一個C#程序,連接Kinect并調用Kinect SDK標準函數庫來改變Kinect的俯仰角。
首先我們打開VS創建一個項目。選擇Visual C#下面的Windows,然后選擇控制臺應用程序,命名為Kinect_Controller,選擇你自己的保存路徑。
建完之后,來到解決方案資源管理器。找到引用,右鍵——添加引用,在彈出的引用管理器中,右上角直接搜索Kinect,勾選MicrosoftKinect 1.8.0.0,然后點擊確定。
如果組件引用設置正常的話,我們就可以在引用下面看到Kinect的相關組件。
接下來是我們的主程序。先在這里把全部的代碼貼出來再解釋。
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Kinect;
using System.Threading;namespace Kinect_Controller
{class Program{static void Main(string[] args){KinectSensor sensor = KinectSensor.KinectSensors[0];if (sensor == null){Console.WriteLine("找不到任何可用的Kinect裝置,程序退出");return;}sensor.Start();//獲取連接在PC上的第一個傳感器并且啟動sensor.ElevationAngle = 0;//俯仰角度恢復到零度Console.WriteLine("Kinect已啟動,空格鍵退出");Console.WriteLine("現在角度為" + 0);ConsoleKey press;//向上箭頭加5度,向下箭頭減5度,并內置最大最小角度檢測while((press = Console.ReadKey().Key)!= ConsoleKey.Spacebar){if (press == ConsoleKey.DownArrow){if (sensor.ElevationAngle - 5 < sensor.MinElevationAngle)sensor.ElevationAngle = sensor.MinElevationAngle;elsesensor.ElevationAngle = sensor.ElevationAngle - 5;}else if(press == ConsoleKey.UpArrow){if (sensor.ElevationAngle + 5 > sensor.MaxElevationAngle)sensor.ElevationAngle = sensor.MaxElevationAngle;elsesensor.ElevationAngle = sensor.ElevationAngle + 5;}Thread.Sleep(1000);Console.WriteLine("現在角度為"+ sensor.ElevationAngle);}sensor.Stop();}}
}
下面我們來從上向下詳細解釋一下代碼。
(1)我們在最上方加入了兩個命名空間。
using Microsoft.Kinect;//告知編譯程序使用該命名空間,所有的用C#寫的Kinect程序都需要如此。
using System.Threading;//程序中使用了Thread方法,所以要引入此命名空間。
(2)獲得傳感器
KinectSensor sensor = KinectSensor.KinectSensors[0];
直到sensor.Start();這一代碼段,是要獲取與pc連接的第一個Kinect傳感器。如果為空,則輸出”找不到任何可用的Kinect裝置,程序退出”,若不為空,則啟動Kinect。
(3)重置角度
Kinect的俯仰角度可能因為人為原因或者程序原因初始情況并不位于零度,所以啟動Kinect后,我們首先要重置Kinect的角度。使用sensor.ElevationAngle = 0,并且輸出兩句話來說明我們的程序。
(4)結合邊界機制上下方向鍵調節角度
因為Kinect中角度俯仰范圍為-27~27,所以我們要加入檢測機制。
這個并不困難,原理是讀入的按鈕如果是上方向鍵(下方向鍵),角度如果加5度(減5度)后不超過最大角度那么是安全的,如果將會超過,那么就讓它的角度等于最大角度。
sensor.MinElevationAngle和sensor.MaxElevationAngle分別是-27和+27。
并且在調整角度后,輸出當前的角度,以提醒操作者
(5)退出
while((press = Console.ReadKey().Key)!= ConsoleKey.Spacebar)
這是while的條件,所以當我們按下空格的時候,會跳出轉而直接執行sensor.Stop()退出程序。
(6)注意事項以及存在的問題
Kinect for Windows 1.0的官方文檔中提到,1秒鐘內最多改變一次角度,連續改變15次后,系統將強制休息20秒以防止電機過熱,這也是為什么我們會引入Thread(1000)的原因,就是契合這一要求讓Kinect得到充分的休息和冷卻。
因為這一點,我們的程序本身就難免會存在一些問題,如果你按下上下方向鍵的頻率快于一秒,鍵盤的輸入會累積在緩沖區等待處理,因為我們的設定是等一秒,處理一次。這會造成很大的延遲和卡頓。我們可以根據需要做一些優化處理,即在沉睡的1秒內,將鍵盤輸入無效化,這一次我們先不做深入討論,因為寫博文的時候,我的C#也是有點兒慘不忍睹的。
最后一個是.NET組件版本的問題,默認情況下,VS認為你的程序需要綁定特定版本的.NET組件。這樣就會造成組件升級后,VS找不到原來版本的組件而無法編譯。所以在解決方案資源管理器中,選中Microsoft.Kinect右鍵——屬性,特定版本改為False就可以了。
下面來自己跑一跑這個Kinect程序,運行結果如下。
注:博文中代碼參考并修改自《Kinect體感程序設計入門》。
2015.3.25 10:05
By Mr.Losers