繼上一篇的骨架追蹤成功繪製出顏色區分,
本篇將在介紹一支好用的DLL,可以讓我們輕鬆就寫出左右手揮動的控制。
當我們安裝完Kinect SDK V1.5 後,
可以在範例找到一個名為SlideshowGestures-WPF的範例,
並將此範例抓下來。
開啟新專案,將使用到的參考都加入
Microsoft.Samples.Kinect.SwipeGestureRecognizer.dll
可以在SlideshowGestures-WPF範例尋找。
接下來程式撰寫為下面三個步驟:
1.加入使用到的命名空間。
2.開啟Kinect的骨架串流資料。
3.當Kinect偵測到骨架時欲做的事情。
本篇將直接使用SwipeGestureRecognizer的方法來判斷使用者的手勢,
目前此方法只有兩種手勢:
1.左手向右揮
2.右手向左揮
這邊我們將手勢拿來控制鍵盤動作,
在System.Windows.Forms參考裡面,
有 SenKeys 函示能直接控制鍵盤。
完整 xaml.cs code
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;
using Microsoft.Samples.Kinect.SwipeGestureRecognizer;
namespace handSwipeDemo
{
///
/// MainWindow.xaml 的互動邏輯
///
public partial class MainWindow : Window
{
///
/// 使用的識別
///
private readonly Recognizer activeRecognizer;
///
///Kinect接收的骨架陣列
///
private Skeleton[] skeletons = new Skeleton[0];
KinectSensor k;
Boolean skeletonFlag = false;
public MainWindow()
{
InitializeComponent();
//取得第一台Kinect
k = KinectSensor.KinectSensors[0];
// 建立一個手勢的辨識
this.activeRecognizer = this.CreateRecognizer();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (k != null)
{
//開啟骨架串流
k.SkeletonStream.Enable();
k.SkeletonFrameReady += new EventHandler(k_SkeletonFrameReady);
k.Start();
}
else
MessageBox.Show("尚未連接Kinect設備!");
}
void k_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
skeletonFlag = isSkeletonTracking(skeletonFlag);
using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
{
if (skeletonFrame != null)
{
skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
skeletonFrame.CopySkeletonDataTo(skeletons);
}
if (skeletons.Length != 0)
{
foreach (Skeleton skel in skeletons)
{
if (skel.TrackingState == SkeletonTrackingState.Tracked)
{
skeletonFlag = true;
activeRecognizer.Recognize(sender, skeletonFrame, this.skeletons);
}
}
}
}
}
//判斷燈號顏色,用於是否追蹤到骨架,黑色代表未追蹤,綠色代表追蹤到
private Boolean isSkeletonTracking(Boolean flag)
{
if (flag)
{
//顯示綠色燈號
ellipse1.Fill = new SolidColorBrush(System.Windows.Media.Color.FromRgb(0, 255, 0));
flag = false;
}
else
//顯示黑色燈號
ellipse1.Fill = new SolidColorBrush(System.Windows.Media.Color.FromRgb(0, 0, 0));
return flag;
}
private Recognizer CreateRecognizer()
{
var recognizer = new Recognizer();
// 右手往左揮
recognizer.SwipeRightDetected += (s, e) =>
{
System.Windows.Forms.SendKeys.SendWait("{Right}");
};
// 左手往右揮
recognizer.SwipeLeftDetected += (s, e) =>
{
System.Windows.Forms.SendKeys.SendWait("{Left}");
};
return recognizer;
}
}
}
完整xaml code
<Window x:Class="handSwipeDemo.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" Loaded="Window_Loaded">
<Grid>
<StackPanel>
<TextBlock Text="顯示黑色圈圈,代表骨架未追蹤到!" />
<TextBlock Text="顯示綠色圈圈,代表骨架追蹤到!"/>
</StackPanel>
<Canvas x:Name="CanvasSkeleton" Height="200" Width="200" />
<Ellipse x:Name="ellipse1" Height="50" Width="50" HorizontalAlignment="Center" />
</Grid>
</Window>
參考資料:
範例下載:handSwipeDemo

(急)請問要如何在裡面增加滑鼠指標移動及點取的動作呢?
要控制滑鼠可以參考這個範例: http://kinectmouse.codeplex.com/
能否請問一下wpf換成winform private void DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e) { //pictureBox1.Image = e.OpenDepthImageFrame(); bool receiveData = false; using (DepthImageFrame depthImageFrame = e.OpenDepthImageFrame()) { if (depthImageFrame == null) { //if (pixelData == null) //{ // pixelData = new short[depthImageFrame.PixelDataLength]; // } //depthImageFrame.CopyPixelDataTo(pixelData); //receiveData = true; } else { pixelData = new short[depthImageFrame.PixelDataLength]; depthImageFrame.CopyPixelDataTo(pixelData); receiveData = true; } } if (receiveData) { } } 這邊物件導向的picture該怎麼編譯才能秀出它的影像?
抱歉,本人目前正在服役, 身邊沒有軟體可以研究, 所以要靠你自己去研究看看。
請問假如我要修改手勢(如左手舉高 右手向右平舉 這樣是否要新增一段判斷式子? 因為是初學者所以什麼都不太懂 可以大概解釋一下如何判斷嗎 感謝您
如果你真的什麼都不太懂,強烈建議你先去看完曹祖聖老師的教學影片。http://msdn.microsoft.com/zh-tw/hh367958.aspx 因Kinect可以偵測到人體的20個關節點, 而每個關節點都有x,y,z三軸座標,所以要做手勢判斷就不困難了, 例如判斷左手舉起,可以以頭部為基準點, 當左手y值大於頭部的y值,則就可以判斷左手舉起。 你可以參考HKT的這篇教學: http://tw-hkt.blogspot.tw/2012/03/kinect-for-windows-sdk-v1.html