kinect二次开发_Kinect for Windows SDK开发初体验(二)操作Camera
作者:馬寧
Kinect SDK出來之后,不到24小時,很多Geek們已經將自己的示例發布到網上去了。可見,好東西肯定會被大家認可的,不好的東西投入再多的宣傳也沒用。
這一篇我們就要正式進入Kinect的編程世界了,介紹我們如何從Camera獲取圖像信息。先來介紹一下Kinect的整體結構,省得大家在后邊的介紹中被某些名詞弄暈。
Kinect一共有三個Camera,其中中間的一個是RGB Camera,用來獲取640x480的彩色圖像,每秒鐘最多獲取30幀圖像;兩側是兩個景深(3D Depth)傳感器,用來檢測玩家的相對位置,原理和人眼立體成像是一樣的,不過這兩個傳感器使用的是紅外線,所以說奧巴馬玩不了Kinect的人一定是居心叵測。Kinect兩側是麥克風,下邊還有一個可移動底座,用來調整Kinect的仰角。
Kinect開發環境
今天我們主要是操作RGB Camera和Depth Sensor,首先,我們要完成Kinect開發環境的配置:
第一步,創建WPF工程
打開Visual Studio 2010,創建一個WPF工程,名叫KinectWpfDemo:
當然,由于Kinect SDK中包含基于.NET的程序集,除了WPF外,我們使用.NET WinForm或XNA框架都可以,目前還沒有人在Silverlight平臺上實驗成功。
第二步,添加Kinect程序集的引用
在Solution Explorer中,右鍵單擊KinectWpfDemo,在右鍵菜單中選擇“Add Reference…”。在彈出的對話框中,我們在.NET標簽頁里,選擇“Microsoft.Research.Kinect”程序集。如下圖所示:
第三步,添加Coding4Fun Kinect Toolkit
這是一個可選項,不過為了之后的編程方便,建議大家添加一個。Coding4Fun Kinect Toolkit的下載地址:
解壓縮后,一共有五個文件,針對WinForm、WPF平臺,還有一個Microsoft.Expression.Drawing.dll。我們通過Add Reference,將Coding4Fun.Kinect.Wpf.dll添加進來。
獲取RGB Camera數據
第四步,添加控件
雙擊打開MainWindow.xaml,在設計器中添加兩個Image控件,一個用于顯示RGB圖像,另一個用于顯示Depth信息。
第五步,引用命名空間
打開MainWindow.xaml.cs文件,在文件頭部添加對于Kinect對象的引用: using Microsoft.Research.Kinect.Nui;
using Microsoft.Research.Kinect.Audio;
using Coding4Fun.Kinect.Wpf;
回到MainWindow.xaml的設計器中,在屬性窗口中選擇Event,找到Loaded和Closed兩個方法,分別雙擊,添加兩個事件的處理函數:
在MainWindow.xaml.cs文件的MainWindow類中,聲明Runtime的變量:
Runtime nui;
然后,在Loaded事件的處理函數中添加Runtime初始化的代碼:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
nui = new Runtime();
nui.Initialize(RuntimeOptions.UseColor| RuntimeOptions.UseDepth | RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking);
}
接下來是Closed事件中關閉Runtime的代碼:
private void Window_Closed(object sender, EventArgs e)
{
nui.Uninitialize();
}
Runtime對象是Kinect SDK中最主要的一個類,所有針對Kinect的操作都由Runtime類進行了封裝。Runtime的構造函數沒有接受任何參數,但有一個顯式的初始化函數Initialize,接受RuntimeOptions參數,指定調用Kinect的哪些功能。其中RuntimeOptions.UseColor表示使用RGB Camera,而RuntimeOptions.UseDepth則表示使用Depth傳感器。
初始化工作完成之后,我們要通過RGB Camera來獲取實時的圖像數據了。我們首先要聲明一個事件處理方法,來接收視頻數據的信息:
nui.VideoFrameReady += new EventHandler(nui_VideoFrameReady);
然后是事件處理函數:
void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
{
PlanarImage imageData = e.ImageFrame.Image;
image1.Source = BitmapSource.Create(imageData.Width, imageData.Height, 96, 96,
PixelFormats.Bgr32, null, imageData.Bits, imageData.Width * imageData.BytesPerPixel);
//image1.Source = e.ImageFrame.ToBitmapSource();
}
提示:Getting Started上提供的Sample Code有誤,需要將最后一個參數中的data.Width改為imageData.Width才可以正常運行。
VideoFrameReady事件會傳遞一個ImageFrameReadyEventArgs參數給事件處理函數,其中的ImageFrame會包含關于圖片的各種信息,比如Type變量指定了圖像是來自RGB還是Depth,Resolution變量指定了分辨率,而Image中以byte[]數組的方式保存了圖像的真實數據。
然后的工作就是根據PlanarImage中包括的數據來創建一個Bitmap對象,然后將其傳遞給Image控件,顯示到WPF程序的界面上。
最后,我們還要在構造函數里打開視頻流,來獲取視頻數據:
nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
第一個參數是ImageStreamType,用來指定打開的設備流類型;第二個參數是PoolSize,指定緩沖區的數量,至少為2,保證一個Buffer進行繪制,另一個Buffer進行數據填充;第三個參數指定Camera的分辨率;第四個參數則是獲取的圖片類型。
顯示效果如下圖所示:
上面的示例代碼,沒有使用Coding4Fun的Helper類,如果使用的話,則代碼如下:
void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
{
image1.Source = e.ImageFrame.ToBitmapSource();
e.ImageFrame.ToBitmapSource().Save("catpure.jpg", ImageFormat.Jpeg);
}
Helper類使用了C#的Extension Methods,為ImageFrame增加了一些轉換方法。我們還可以將圖像保存為文件,考慮到文件系統存儲的效率文件,建議大家不用每張都存。
獲取Depth信息
接下來我們要獲取Depth信息了,過程與RGB Camera類似。首先要確保Runtime對象被初始化時,已經添加了RuntimeOptions.UseDepth的屬性,否則設備無法正常打開。
然后,添加獲取Depth數據的事件處理,并打開Depth的數據流,這次的分辨率是320x240:
nui.DepthFrameReady += new EventHandler(nui_DepthFrameReady);
nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.Depth);
下面是事件處理函數,在另外一個Image函數里,顯示Depth圖像:
void nui_DepthFrameReady(object sender, ImageFrameReadyEventArgs e)
{
image2.Source = e.ImageFrame.ToBitmapSource();
}
偷懶,所以使用了Coding4Fun的Helper類。程序運行的效果如下:
寫到最后
這一篇中,我們完成了Kinect開發環境的配置、添加了Coding4Fun Kinect Toolkit、從RGB Camera和Depth Sensor中獲取了圖像信息。
接下來,我們就要進入Kinect動作捕捉部分了。
總結
以上是生活随笔為你收集整理的kinect二次开发_Kinect for Windows SDK开发初体验(二)操作Camera的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iview select选中值取值_完美
- 下一篇: 为什么洗衣粉洗的内裤有尿啧会有味道