Upload
ingchyuan-wu
View
706
Download
1
Embed Size (px)
Citation preview
Kinect Posture 偵測與應用
Kinect02 目標、開發、執行
Kinect Posture 偵測與應用系統簡介
Kinect02 畫面規劃
Kinect02 實作
Kinect02 解說
2
6
Kinect02 程式將 SlideShow 圖片播放程式加上 Kinect
Posture 操控功能,讓使用者除了滑鼠、觸控螢幕操
控之外,亦可以身體的姿勢操控自動播放彩色影像,
或一次播放一張彩色影像。
開發工具為Windows 10 加上 Visual Studio 2015 環境
之 C# + WPF + Kinect for Windows SDK 2.0
Kinect02 目標、開發、執行
7
程式執行時需在桌面有名為MImage之檔案夾,內
置數目不限的圖檔。
程式執行時需將 Kinect One 接上電腦之 USB 3.0 插
槽,建議將螢幕解析度調為 1920x1080或以上。
Kinect02 專案下載 (Kinect02.zip & Mimage.zip)
https://onedrive.live.com/redir?resid=AB6DA2015C8C4A60!2308&
authkey=!ANeqqNQzHPgLwbw&ithint=file%2czip
https://onedrive.live.com/redir?resid=AB6DA2015C8C4A60!2309&
authkey=!ADu9H-hhNq75Lig&ithint=file%2czip
8
Kinect Posture 偵測與應用系統簡介
Posture 指身體擺出某種姿勢,例如
右手向上高舉 (自動播放, AutoShow類別)
左手肘高舉 (向後一張, Previous類別)
右手肘高舉 (向前一張, Next類別)
左手向左平舉 (到第一張, First類別)
右手向右平舉 (到最後一張, Last類別)
9
每種姿勢的偵測功能寫成一個類別 (class)
程式同時偵測五種姿勢,若有符合任一姿勢標準,
則觸發該事件。
AutoShow、Previous、Next、First、Last五個類別
觸發的事件,其功能分別對等於 AutoShow、
Previous、Next、First、Last五個控制項的 Click事件。
10
利用 Kinect for Windows SDK 2.0 提供的骨架座標
利用 Body類別的物件儲存骨架座標資料
使用到的關節點為 JointType之 6個列舉值:
ShoulderLeft、ElbowLeft、WristLeft、
ShoulderRight、ElbowRight、WristRight
利用6 個關節點座標資料判斷 AutoShow、Previous、
Next、First、Last五種姿勢。
12
構想此程式含有底下元件:
一個 Image秀出圖檔
一個 CheckBox操控自動播放
四個 Button分別操控前一張、後一張、最前張、最後
張播放
一個 ProgressBar顯示播放進度
Kinect02 畫面規劃
13
視窗大小為 1440x810 (SlideShow)
Image控制項顯示 1024x768圖像 (SlideImage)
CheckBox控制項操控自動播放 (AutoShow)
Button控制項操控前一張播放(<) (Previous)
Button控制項操控後一張播放(>) (Next)
Button控制項操控最前張播放(<<) (First)
Button控制項操控最後張播放(>>) (Last)
ProgressBar控制項顯示播放進度 (Progress)
14
建立 Kinect02 方案
起動 Visual Studio Professional 2015
點選「檔案(F)」→「新增(N)」→「專案(P)…」→「Visual
C#」→「WPF 應用程式」
「名稱(N)」填入 Kinect02 (原來是WpfApplication1)
「位置(L)」利用瀏覽(B)… 選定目錄
點選「確定」
Kinect02 實作
15
加入Microsoft.Kinect組件使 SDK 可以被專案使用
在『參考』處按右鍵,點選『加入參考(R)』
點選「擴充功能」→挑選「Microsoft.Kinect 2.0.0.0」
→ CheckBox 處點一下使出現打勾
點選「確定」
19
將Window 屬性修改為
名稱:Kinect02
Background:單色筆刷(R:100 G:200 B:150 A:100%)
FontSize:20
Height:810
ResizeMode:CanMinimize
Title:Slide Show (Kinect)
Width:1440
程式執行時,視窗只可縮至最小,無法放大
20
將 Kinect02 視窗加入一個 Image 控制項
滑鼠在工具箱的 Image點一下,然後在視窗設計區點一下
名稱:SlideImage
將 SlideImage屬性修改為
Height:768
Margin:0 0 0 0
Width:1024
21
將 Kinect02 加入一個 CheckBox 控制項
名稱:AutoShow
將 AutoShow屬性修改為
Background:單色筆刷 (R:60 G:120 B:180 A:100%)
Content:自動播放 (右手高舉) FontSize:32
Foreground:單色筆刷 (R:230 G:230 B:50 A:100%)
Height:50
HorizontalContentAlignment:Center
Margin:1070 20 0 0
VerticalContentAlignment:Center
Width:310
22
將 Kinect02 加入四個 Button 控制項
名稱:Previous
將 Previous屬性修改為
Background:單色筆刷 (R:200 G:100 B:200 A:100%)
Content:< (左手肘高舉 )
FontSize:32
Height:50
Margin:1070 100 0 0
Width:310
23
名稱:Next
將 Next屬性修改為
Background:單色筆刷 (R:200 G:100 B:200 A:100%)
Content:> (右手肘高舉)
FontSize:32
Height:50
Margin:1070 170 0 0
Width:310
24
名稱:First
將 First屬性修改為
Background:單色筆刷 (R:200 G:100 B:200 A:100%)
Content:<< (左手平舉)
FontSize:32
Height:50
Margin:1070 240 0 0
Width:310
25
名稱:Last
將 Last屬性修改為
Background:單色筆刷 (R:200 G:100 B:200 A:100%)
Content:>> (右手平舉)
FontSize:32
Height:50
Margin:1070 310 0 0
Width:310
26
將 Kinect02 加入一個 ProgressBar 控制項
名稱:Progress
將 Progress屬性修改為
Background:單色筆刷 (R:220 G:200 B:100 A:100%)
FontSize:32
Foreground:單色筆刷 (R:200 G:100 B:200 A:100%)
Height:30
Margin:1070 390 0 0
Width:310
27
滑鼠雙擊 Kinect02事件視窗的 Loaded右邊空白欄位
滑鼠雙擊 Kinect02事件視窗的 Unloaded右邊空白欄位
滑鼠雙擊 AutoShow事件視窗的 Click右邊空白欄位
滑鼠雙擊 Previous事件視窗的 Click右邊空白欄位
滑鼠雙擊 Next事件視窗的 Click右邊空白欄位
滑鼠雙擊 First事件視窗的 Click右邊空白欄位
滑鼠雙擊 Last事件視窗的 Click 右邊空白欄位
加入 Kinect02 專案欲處理的事件
34
輸入 timer.Tick +=接著按 Tab鍵自動產生 timer_Tick函式
每間隔 2秒,會觸發一次 Tick事件,希望每次 Tick 事件被觸發時做甚麼事情,就寫在 timer_Tick 函式裏。
42
在『C# Kinect02』處按右鍵,點選『加入(D)』→『類別
(C)…』→「名稱(N)」填入 AutoShow.cs →「新增(A)」
加入 Kinect02 五個姿勢偵測的類別
在『Kinect02』處按右鍵,點選『加入(D)』→『類別(C)…』
44
在『C# Kinect02』處按右鍵,點選『加入(D)』→『類別
(C)…』→「名稱(N)」填入 Previous.cs →「新增(A)」
在『C# Kinect02』處按右鍵,點選『加入(D)』→『類別
(C)…』→「名稱(N)」填入 Next.cs →「新增(A)」
在『C# Kinect02』處按右鍵,點選『加入(D)』→『類別
(C)…』→「名稱(N)」填入 First.cs →「新增(A)」
在『C# Kinect02』處按右鍵,點選『加入(D)』→『類別©…』
→「名稱(N)」填入 Last.cs →「新增(A)」
97
Kinect 骨架串流相關類別
KinectSensor類別的物件代表一台 Kinect One,以
GetDefault( ) 方法連接Kinect One,以 Open( )方法啟動
Kinect One,以 Close( )方法停止 Kinect One
新的影格資料送達電腦時觸發 BodyFrameReader的
FrameArrived事件,可利用事件傳遞的參數
BodyFrameArrivedEventArgs 物件取得影格資料
(BodyFrame物件)
Kinect02 解說
98
KinectSensor 類別
https://msdn.microsoft.com/en-
us/library/windowspreview.kinect.kinectsensor.aspx?cs-save-
lang=1&cs-lang=csharp#code-snippet-1
KinectSensor類別的物件代表一台 Kinect One,以
GetDefault( ) 方法連接 Kinect One,以 Open( )方法啟動
Kinect One,以 Close( )方法停止 Kinect One
BodyFrameSource屬性取得骨架資料來源
99
BodyFrameReader 類別
https://msdn.microsoft.com/en-
us/library/windowspreview.kinect.bodyframereader.aspx
BodyFrameReader類別的物件操控骨架資料串流
FrameArrived事件被觸發當骨架資料送達時
100
BodyFrame 類別
https://msdn.microsoft.com/en-
us/library/windowspreview.kinect.bodyframe.aspx
BodyFrame類別的物件儲存骨架資料串流
BodyCount 屬性:可追踪骨架的數目
BodyFrameSource:取得骨架資料來源
GetAndRefreshBodyData( ) 方法:取得骨架資料存入指定
的陣列
101
Body 類別
https://msdn.microsoft.com/en-
us/library/windowspreview.kinect.body.aspx
Body類別的物件描述ㄧ副骨架資料
IsTracked 屬性:判斷骨架是否被追踪
Joints屬性:取得骨架關節座標
102
BodyFrameArrivedEventArgs 類別
https://msdn.microsoft.com/en-
us/library/windowspreview.kinect.bodyframearrivedeventar
gs.aspx
BodyFrameReader的 FrameArrived事件,傳遞的參數就是
BodyFrameArrivedEventArgs 類別的物件,含有骨架資料
(BodyFrame物件)
FrameReference屬性取得骨架資料來源的參照
103
JointType 列舉
https://msdn.microsoft.com/en-
us/library/microsoft.kinect.jointtype.aspx
各成員所代表整數值如下頁所示:
106
C# 之 event
https://msdn.microsoft.com/zh-tw/library/8627sbea.aspx
Event (事件) 與 delegate (派遣)
public event EventHandler Detected
.NET Framework 之 EvenHandler
https://msdn.microsoft.com/zh-
tw/library/system.eventhandler(v=vs.110).aspx
107
.NET Framework Math 類別
https://msdn.microsoft.com/zh-
tw/library/system.math(v=vs.110).aspx
Abs( ) 方法
108
.NET Framework TimeSpan 結構
https://msdn.microsoft.com/zh-
tw/library/system.timespan(v=vs.110).aspx
TimeSpan(Int64) 建構函式 (10000000代表 1秒)