日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

kinect二次开发_Kinect for Windows SDK开发初体验(二)操作Camera

發(fā)布時(shí)間:2025/4/5 windows 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kinect二次开发_Kinect for Windows SDK开发初体验(二)操作Camera 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:馬寧

Kinect SDK出來之后,不到24小時(shí),很多Geek們已經(jīng)將自己的示例發(fā)布到網(wǎng)上去了。可見,好東西肯定會被大家認(rèn)可的,不好的東西投入再多的宣傳也沒用。

這一篇我們就要正式進(jìn)入Kinect的編程世界了,介紹我們?nèi)绾螐腃amera獲取圖像信息。先來介紹一下Kinect的整體結(jié)構(gòu),省得大家在后邊的介紹中被某些名詞弄暈。

Kinect一共有三個(gè)Camera,其中中間的一個(gè)是RGB Camera,用來獲取640x480的彩色圖像,每秒鐘最多獲取30幀圖像;兩側(cè)是兩個(gè)景深(3D Depth)傳感器,用來檢測玩家的相對位置,原理和人眼立體成像是一樣的,不過這兩個(gè)傳感器使用的是紅外線,所以說奧巴馬玩不了Kinect的人一定是居心叵測。Kinect兩側(cè)是麥克風(fēng),下邊還有一個(gè)可移動底座,用來調(diào)整Kinect的仰角。

Kinect開發(fā)環(huán)境

今天我們主要是操作RGB Camera和Depth Sensor,首先,我們要完成Kinect開發(fā)環(huán)境的配置:

第一步,創(chuàng)建WPF工程

打開Visual Studio 2010,創(chuàng)建一個(gè)WPF工程,名叫KinectWpfDemo:

當(dāng)然,由于Kinect SDK中包含基于.NET的程序集,除了WPF外,我們使用.NET WinForm或XNA框架都可以,目前還沒有人在Silverlight平臺上實(shí)驗(yàn)成功。

第二步,添加Kinect程序集的引用

在Solution Explorer中,右鍵單擊KinectWpfDemo,在右鍵菜單中選擇“Add Reference…”。在彈出的對話框中,我們在.NET標(biāo)簽頁里,選擇“Microsoft.Research.Kinect”程序集。如下圖所示:

第三步,添加Coding4Fun Kinect Toolkit

這是一個(gè)可選項(xiàng),不過為了之后的編程方便,建議大家添加一個(gè)。Coding4Fun Kinect Toolkit的下載地址:

解壓縮后,一共有五個(gè)文件,針對WinForm、WPF平臺,還有一個(gè)Microsoft.Expression.Drawing.dll。我們通過Add Reference,將Coding4Fun.Kinect.Wpf.dll添加進(jìn)來。

獲取RGB Camera數(shù)據(jù)

第四步,添加控件

雙擊打開MainWindow.xaml,在設(shè)計(jì)器中添加兩個(gè)Image控件,一個(gè)用于顯示RGB圖像,另一個(gè)用于顯示Depth信息。

第五步,引用命名空間

打開MainWindow.xaml.cs文件,在文件頭部添加對于Kinect對象的引用: using Microsoft.Research.Kinect.Nui;

using Microsoft.Research.Kinect.Audio;

using Coding4Fun.Kinect.Wpf;

回到MainWindow.xaml的設(shè)計(jì)器中,在屬性窗口中選擇Event,找到Loaded和Closed兩個(gè)方法,分別雙擊,添加兩個(gè)事件的處理函數(shù):

在MainWindow.xaml.cs文件的MainWindow類中,聲明Runtime的變量:

Runtime nui;

然后,在Loaded事件的處理函數(shù)中添加Runtime初始化的代碼:

private void Window_Loaded(object sender, RoutedEventArgs e)

{

nui = new Runtime();

nui.Initialize(RuntimeOptions.UseColor| RuntimeOptions.UseDepth | RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking);

}

接下來是Closed事件中關(guān)閉Runtime的代碼:

private void Window_Closed(object sender, EventArgs e)

{

nui.Uninitialize();

}

Runtime對象是Kinect SDK中最主要的一個(gè)類,所有針對Kinect的操作都由Runtime類進(jìn)行了封裝。Runtime的構(gòu)造函數(shù)沒有接受任何參數(shù),但有一個(gè)顯式的初始化函數(shù)Initialize,接受RuntimeOptions參數(shù),指定調(diào)用Kinect的哪些功能。其中RuntimeOptions.UseColor表示使用RGB Camera,而RuntimeOptions.UseDepth則表示使用Depth傳感器。

初始化工作完成之后,我們要通過RGB Camera來獲取實(shí)時(shí)的圖像數(shù)據(jù)了。我們首先要聲明一個(gè)事件處理方法,來接收視頻數(shù)據(jù)的信息:

nui.VideoFrameReady += new EventHandler(nui_VideoFrameReady);

然后是事件處理函數(shù):

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有誤,需要將最后一個(gè)參數(shù)中的data.Width改為imageData.Width才可以正常運(yùn)行。

VideoFrameReady事件會傳遞一個(gè)ImageFrameReadyEventArgs參數(shù)給事件處理函數(shù),其中的ImageFrame會包含關(guān)于圖片的各種信息,比如Type變量指定了圖像是來自RGB還是Depth,Resolution變量指定了分辨率,而Image中以byte[]數(shù)組的方式保存了圖像的真實(shí)數(shù)據(jù)。

然后的工作就是根據(jù)PlanarImage中包括的數(shù)據(jù)來創(chuàng)建一個(gè)Bitmap對象,然后將其傳遞給Image控件,顯示到WPF程序的界面上。

最后,我們還要在構(gòu)造函數(shù)里打開視頻流,來獲取視頻數(shù)據(jù):

nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);

第一個(gè)參數(shù)是ImageStreamType,用來指定打開的設(shè)備流類型;第二個(gè)參數(shù)是PoolSize,指定緩沖區(qū)的數(shù)量,至少為2,保證一個(gè)Buffer進(jìn)行繪制,另一個(gè)Buffer進(jìn)行數(shù)據(jù)填充;第三個(gè)參數(shù)指定Camera的分辨率;第四個(gè)參數(shù)則是獲取的圖片類型。

顯示效果如下圖所示:

上面的示例代碼,沒有使用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增加了一些轉(zhuǎn)換方法。我們還可以將圖像保存為文件,考慮到文件系統(tǒng)存儲的效率文件,建議大家不用每張都存。

獲取Depth信息

接下來我們要獲取Depth信息了,過程與RGB Camera類似。首先要確保Runtime對象被初始化時(shí),已經(jīng)添加了RuntimeOptions.UseDepth的屬性,否則設(shè)備無法正常打開。

然后,添加獲取Depth數(shù)據(jù)的事件處理,并打開Depth的數(shù)據(jù)流,這次的分辨率是320x240:

nui.DepthFrameReady += new EventHandler(nui_DepthFrameReady);

nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.Depth);

下面是事件處理函數(shù),在另外一個(gè)Image函數(shù)里,顯示Depth圖像:

void nui_DepthFrameReady(object sender, ImageFrameReadyEventArgs e)

{

image2.Source = e.ImageFrame.ToBitmapSource();

}

偷懶,所以使用了Coding4Fun的Helper類。程序運(yùn)行的效果如下:

寫到最后

這一篇中,我們完成了Kinect開發(fā)環(huán)境的配置、添加了Coding4Fun Kinect Toolkit、從RGB Camera和Depth Sensor中獲取了圖像信息。

接下來,我們就要進(jìn)入Kinect動作捕捉部分了。

總結(jié)

以上是生活随笔為你收集整理的kinect二次开发_Kinect for Windows SDK开发初体验(二)操作Camera的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。