Kinect 入門心得

感謝胡哥的支持,我和宇神才能夠有一點點的進步。
更要感謝網絡上面各路大神無私奉獻的精神
儘管之前也或多或少的看過C#,也玩過Kinect,但是隻停留在了玩的程度。
今天晚上在胡哥的鼓勵下,最終還是比較正式比較努力的開始進行了Kinect的一步步學習。

由於我們沒有比較全面的學習資料,所以我和宇神就在網上各種搜索資料學習,我也成功的翻到牆的另一頭去看了看精彩的世界,最後還是沒有能夠找到比較合適的資源。宇神用他的破電腦找到了一個blog,先貼在這裏,供大家學習參考,感謝博主的無私分享
http://www.cnblogs.com/yangecnu/

恩,是這樣的,因爲博文是翻譯的文章,我們是根據這個來進行的學習,第一篇是基礎的環境配置之類的東西,就不再贅述了。
需要注意的是各位如果想要進行開發學習的話要注意設備和SDK包的版本匹配,1.0可以和Kinect搭配使用,2.0的應該是需要和最新的Kinect2.0搭配使用的,因爲筆者囊中羞澀,就沒有用最新的進行實驗了。

今晚花費比較多的時間就在於我們在進行第二套實驗的時候,因爲我們有源代碼的原因,所以就直接看着上手,先不論理解多少,先嚐試着run一下

源代碼先送上:
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;

namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private KinectSensor kinect;

public MainWindow()
{
InitializeComponent();
this.Loaded += (s, e) => DiscoverKinectSensor();
this.Unloaded += (s, e) => this.kinect = null;
}

public KinectSensor Kinect
{
get { return this.kinect; }
set
{
//如果帶賦值的傳感器和目前的不一樣
if (this.kinect != value)
{
//如果當前的傳感對象不爲null
if (this.kinect != null)
{
UninitializeKinectSensor(this.kinect);
//uninitailize當前對象
this.kinect = null;
}
//如果傳入的對象不爲空,且狀態爲連接狀態
if (value != null && value.Status == KinectStatus.Connected)
{
this.kinect = value;
InitializeKinectSensor(this.kinect);
}
}
}
}

private void DiscoverKinectSensor()
{
KinectSensor.KinectSensors.StatusChanged += KinectSensors_StatusChanged;
this.Kinect = KinectSensor.KinectSensors.FirstOrDefault(x => x.Status == KinectStatus.Connected);
}

private void KinectSensors_StatusChanged(object sender, StatusChangedEventArgs e)
{
switch (e.Status)
{
case KinectStatus.Connected:
if (this.kinect == null)
this.kinect = e.Sensor;
break;
case KinectStatus.Disconnected:
if (this.kinect == e.Sensor)
{
this.kinect = null;
this.kinect = KinectSensor.KinectSensors.FirstOrDefault(x => x.Status == KinectStatus.Connected);
if (this.kinect == null)
{
//TODO:通知用於Kinect已拔出
}
}
break;
//TODO:處理其他情況下的狀態
}
}

private void InitializeKinectSensor(KinectSensor kinectSensor)
{
if (kinectSensor != null)
{
kinectSensor.ColorStream.Enable();
kinectSensor.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(kinectSensor_ColorFrameReady);
kinectSensor.Start();
}
}

private void UninitializeKinectSensor(KinectSensor kinectSensor)
{
if (kinectSensor != null)
{
kinectSensor.Stop();
kinectSensor.ColorFrameReady -= new EventHandler<ColorImageFrameReadyEventArgs>(kinectSensor_ColorFrameReady);
}
}

void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
using (ColorImageFrame frame = e.OpenColorImageFrame())
{
if (frame != null)
{
byte[] pixelData = new byte[frame.PixelDataLength];
frame.CopyPixelDataTo(pixelData);
ColorImageElement.Source = BitmapImage.Create(frame.Width, frame.Height, 96, 96,
PixelFormats.Bgr32, null, pixelData,
frame.Width * frame.BytesPerPixel);

}
}
}
}
}


<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="350" Width="525">
<Grid>
<Image x:Name="ColorImageElement"></Image>
</Grid>
</Window>


在調試的時候,有這麼幾個問題可能是大家會發生的。
大家在創建工程的時候記得要選擇WPF應用程序
其次,要注意命名空間,文件名不要照抄代碼
當然,大家要記得添加引用集,這是初學者很多時候可能會犯的一個錯誤,也有很多人呢不會做這一步,所以我就圖示教學如下:
先點擊項目->添加引用
這個時候會彈出一個對話框,在左邊選擇程序集,之後再右上角的搜索框中搜索“Kinect”關鍵詞,就會出現Microsoft Kinect 在右邊有版本號,由於我使用的硬件設備是kinect,所以就選擇了1.0的版本,大家視情況而定。之後點擊確定,就可以引用kinect了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章