• 沒有找到結果。

中 華 大 學 碩 士 論 文

N/A
N/A
Protected

Academic year: 2022

Share "中 華 大 學 碩 士 論 文"

Copied!
67
0
0

加載中.... (立即查看全文)

全文

(1)

中 華 大 學 碩 士 論 文

使用 Kinect 感應器偵測人體與手部姿勢以輔助 復健和運動訓練之研究

Using Kinect

®

sensors to detect body and hand gestures for rehabilitation and sport training aids

系 所 別:電機工程學系碩士班 學號姓名:M09901039 鄭凱任 指導教授:蘇建焜 博士

中 華 民 國 103 年 2 月

(2)

i

摘 要

本論文是建構在微軟公司推出的 Kinect®體感應器,利用此感應器 Light Coding 技術產生的深度資訊,來擷取真實空間中手勢空間座標與角度,並評估利用 Kinect 感應器在判斷手勢姿勢與活動上的可行性。在 Kinect 開發上,本論文是利用 Windows Kinect SDK 1.6 所提供的 API 來進行感應器相關資訊的擷取,將收集到的深度資訊及 人體相關關節座標資訊加以分析利用。

本論文主要期望以實作方式來驗證手勢辨識活動來操控系統做為復健輔具的可 行性研究,用以提升復健進行的舒適度與接受度,並藉此能達到居家的復健醫療。在 即時辨識系統下,本論文主要應用 Kinect 空間座標系 Z 軸深度資訊、X 軸與 Y 軸方 向長度距離及角度計算,作為識別技術根據,來判斷使用者手勢姿勢與動作。本論文 以四種不同程序及角度運用作為姿勢追蹤的識別控制基準,藉由互動的體感遊戲設計, 指示使用者玩遊戲的同時,達到復健或運動訓練的目的。

關鍵字:Windows Kinect SDK, 深度影像。

(3)

ii

ABSTRACT

Recently, human computer interface has attracted more and more attention. Instead of using traditional mice, keyboards and joysticks, nowadays many computer-related industries have adopted more intuitive three-dimensional input devices to control multimedia. Wii Remote and Kinect are two such examples which allow users to more easily communicate with the devices/computers. Such input devices also reduce the efforts that a user has to spend on learning how to interact with the multimedia devices. Therefore, using hand gestures to control the media has become more important.

In this paper, we propose a hand gesture tracking system based on a camera with depth information, together with a few image processing techniques and three-dimensional motion estimation methods, to achieve gesture recognition and tracking, so that users can use gestures to control a multimedia system. In order to simplify the problem of high degrees of freedom associated with hand gestures, currently we are only tracking the rigid motions of a hand, namely the three-dimensional rotations and displacements.

KEYWORDS: Windows Kinect SDK, Depth image.

(4)

iii

誌 謝

首先,我要向我的指導教授,蘇建焜老師致上最高的敬意。感謝過去這兩年中,

他們在學業研究與生活上,不停的給我指導與鼓勵。在這研究所的學習生涯中,無論 是在課業或研究及平日會議時,讓我學習到研究應有的態度,也使我在研究以及待人 處事上獲益匪淺。

感謝江明佑及陳昱均學長的照顧,以及感謝實驗室的研究夥伴們對我不斷的給予 建議與指導,特別要感謝和我一起努力的同學王偉存、欉永翰、江政霖、林祈宏、彭 彥鈞、吳哲亨、吳孟儒、徐志超等,有你們的陪伴與討論,實驗過程不再枯燥乏味而 是充滿著歡樂,在實驗過程協助與照顧,此論文是我們一齊努力出來的成果。在此,

由衷地感激母校中華大學提供研究的環境和設備以及技術人員熱心的協助,使我的研 究可以順利進行。有了你們的大力幫忙,使我順利地完成此論文,在此獻上我最深的 敬意。

最後,感謝曾經支持、關心與幫助過我的朋友以及長輩們。尤其是我的家人,有 了他們的支持與鼓勵,陪我度過許多挫折和難關;在我開心時,能一起分享我的喜悅。

因為有你們的相伴,使我順利完成碩士學業與論文。在此,我願將這份榮耀與你們一 同分享,感謝你們。

謹致 中華民國103年2月於新竹

(5)

iv

目 錄

中文摘要 ...

i

英文摘要 ...

ii

誌謝 ...

iii

目錄 ...

iv

表目錄 ...

vi

圖目錄 ...

vii

第一章 緒論 1-1

文獻回顧與探討 ... 1

1-2

研究動機與問題 ... 3

1-3

論文架構 ... 4

第二章 原理與介紹 2-1

微軟 Kinect 體感應器支介紹 ... 5

2-1-1 Kinect 體感應器之硬體描述 ... 5

2-1-2 Kinect for Windows 架構 ... 7

2-1-3 Kinect 體感應器之深度資訊 ... 8

2-1-4 Kinect 體感應器之骨架追蹤系統 ... 12

2-2

Kinect 之座標系統 ... 13

2-2-1

Kinect 深度測量方式 ... 14

(6)

v

2-2-2

各種座標空間及轉換 ... 16

第三章 系統架構與設計 3-1

復健遊戲構想 ... 19

3-1-1

訓練手部活動 ... 19

3-1-2

訓練多方平衡感 ... 19

3-2

系統架構 ... 19

3-2-1

軟體開發工具與環境 ... 19

3-3

系統設計 ... 20

3-3-1

系統架構圖 ... 20

3-3-2

系統流程圖 ... 21

3-4

比對辨識資料庫設計 ... 23

3-4-1

Crayon 連連看體感比對辨識 ... 23

3-4-2

Pose 手勢動作姿勢辨識... 25

第四章 實驗與討論 4-1

Crayon 測試 ... 31

4-1-1

Crayon 測試結果 ... 32

4-1-2

Crayon_Depth 考慮深度影像的測試結果... 32

4-2

四種姿勢程序角度辨識測試 ... 33

4-2-1

Pose 辨識項目取消 StoryBoard 的圖像顯示之測試結果 ... 36

第五章 強化手指方面的辨識

5-1

手指偵測方法 ... 37

5-2

手指偵測展示 ... 42

5-3

於系統中放入手指偵測的應用 ... 43

5-4

新增的遊戲訓練內容 ... 45

(7)

vi

第六章 系統整合

6-

1 增設資料庫 ... 49

6-1-1

資料庫設計 ... 49

6-1-2

資料庫讀取 ... 51

6-2

增設骨架關節撥放系統 ... 51

第七章 結論與未來展望

參考文獻

... 54

(8)

vii

表目錄

第二章 原理介紹與方法

... 5

表 2-1 Kinect 的詳細規格 ... 6

第四章 實驗與討論

... 31

表 4-1 Crayon 執行的測試結果 ... 32

表 4-2 Crayon_Depth 考慮深度影響的測試結果 ... 33

表 4-3 姿勢辨識項由系統任意選定並取消角色示範顯示測試結果 ... 36

(9)

viii

圖目錄

第一章 緒論

... 1

圖 1-1 傅立葉轉換和傅立葉逆轉換 ... 2

圖 1-2 隱藏式馬爾可夫模型狀態變遷圖 ... 2

第二章 原理介紹與方法

... 5

圖 2-1 Kinect 體感應器之硬體 ... 5

圖 2-2 Kinect 的 NUI 程式庫 ... 7

圖 2-3 Kinect for Windows SDK 架構圖 ... 7

圖 2-4 紅外線投影過程 ... 9

圖 2-5 透過夜視設備觀看 Kinect 實際運作情況 ... 9

圖 2-6 Kinect 所投射之 9X9 矩陣 ... 9

圖 2-7 距離而影響散斑集中程度 ... 10

圖 2-8 由 Kinect 感應到的人體骨架 ... 13

圖 2-9 骨架座標系統 ... 14

圖 2-10 Kinect 近紅外攝像機視場 ... 14

圖 2-11 Kinect 景深像素的深度值資訊 ... 15

圖 2-12 玩家身寬換算 ... 16

圖 2-13 Skeleton 骨架空間坐標 ... 17

圖 2-14 人體骨架資訊(a) ... 17

圖 2-15 人體骨架資訊(b) ... 18

第三章 系統架構與設計

... 19

圖 3-1 復健和運動體感遊戲引擎 ... 20

(10)

ix

圖 3-2 手勢動作姿勢辨識系統流程圖 ... 22

圖 3-3 Crayon 布局點畫面 ... 23

圖 3-4 Crayon 連連看完成圖樣 ... 24

圖 3-5 Crayon 建庫資訊 ... 24

圖 3-6 角度計算的依據原理 ... 25

圖 3-7 論文中程式角度計算實作部分 ... 26

圖 3-8 姿勢辨識程序庫 ... 27

圖 3-9 擷取虛擬角色所需的骨架資訊 ... 28

圖 3-10 Excel 中顯示的虛擬角色骨架資訊 ... 28

圖 3-11 程式中植入虛擬角色骨架資訊 ... 29

圖 3-12 遊戲執行時顯現虛擬角色資訊 ... 30

第四章 實驗與討論

... 31

圖 4-1 採用 2 關節點座標計算示意圖 ... 34

第五章 強化手指方面的辨識

... 37

圖 5-1 Turtle Algorithm 尋找及排序 Contour 點示意圖 ... 39

圖 5-2 Turtle Algorithm 尋找 Contour 判別式 ... 39

圖 5-3 手輪廓邊界右下移動示意圖 ... 40

圖 5-4 手心為手掌的內切圓心 ... 41

圖 5-5 手部尖點角度計算 ... 41

圖 5-6 手指偵測實驗結果 ... 43

圖 5-7 (a) 復健體感遊戲選擇 ... 44

圖 5-7 (b) 由右手手指選擇偵測進入 Crayon test ... 44

圖 5-7 (c) 左手手指進入 Pose 選擇偵測區 ... 44

圖 5-7 (d) 由左手手指選擇偵測進入 Pose test ... 45

(11)

x

圖 5-8 sport1 ... 46

圖 5-9 sport2 ... 47

圖 5-10 醫囑 1 ... 47

圖 5-11 醫囑 2 ... 48

第六章 系統整合

... 49

圖 6-1 PoseGroup 資料表 ... 49

圖 6-2 PoseAngle 資料表 ... 50

圖 6-3 查詢報表 ... 50

圖 6-4 骨架關節記錄播放器程式進入點 ... 52

圖 6-5 骨架關節記錄播放器執行實驗 ... 52

(12)

1

第一章 緒論

健康的身體是人類社會追求幸福狀態的永久必要需求; 但隨著科技進步,大量的 機械,取代了人們身體活動的機會。同時,也因高齡化時代的來臨;但是,為了健康,

社會對居家運動與照護的需求也日益劇增。因此利用體感偵測來做為居家看護、醫療 復健便成為這幾年所探討可行性研究的應用延伸。傳統的動作捕捉器(Motion Capture) 在設備的成本及空間需求上不是一般人可以負擔起的。

自從 Microsoft 在 Xbox 上推出 Kinect® 感測裝置後,降低了一般動作捕捉器使 用的門檻,本研究的方法是透過體感偵測技術,偵測骨架與動作,並以深度值及骨架 辨識相互結合來做出與手指辨識與動作捕捉器類似效果。並針對復健上需要的特定動 作,提出一種自製體感遊戲,設計動作姿勢數據維護的方法,作為復健師、研究人員 或相關需求人士之動作設計工具及居家復健、運動訓練的輔具。

1-1 文獻回顧與探討

本論文實作的主題是運用骨架變化來做姿勢動作辨識,並透過深度資訊的運算來 增加使用者操作的便利性。在現有的文獻中,現有的手勢辨識[1]、利用骨架的動作 自動辨識[2]、人體比對視覺系統[3] 、手指辨識[4]等等文獻中都有上述相關的探討。

在文獻[1]中,把手勢辨識系統系統分為追蹤、輪廓分離和手勢辨識三個模組,而 在手勢辨識方面提到使用傅立葉轉換[5]取出係數作為手勢的vector,並投影到空間上 做比對辨識。

(13)

2

圗 1-1 傅立葉轉換和傅立葉逆轉換

而使用星狀骨架來捕捉使用者動作來做自動辨識在文獻[2]中,提到是以隱藏式 馬可夫模型[6]來建立模型,與先前預製的編碼書做比對以辨識使用者的動作,以提 升動作辨識的效能與即時性。

圗 1-2 隱藏式馬爾可夫模型狀態變遷圖

而關於人體比對視覺系統相關的文獻[3]中提及到利用將兩台攝影機所得到的二 維骨架模型利用正向動力學(Forward kinematics)推算出三維骨架的各關節點,與由 Kinect 所捕捉到的畫面有深度值,再利用OpenNI [7]與PrimeSense[8]的NITE 所抓取 到二維骨架做出與上述文獻中有類似的效果,而在OpenNI 的人體骨架的構成基本上 是由關節(joint),每個關節都有位置和方向兩種資料,且這兩者包含信賴度(confidence) 這個值[9],而利用信賴這個值可以判斷出關節的可信度,再結合Kinect 本身有的深 度值,就可以不需要處理兩台攝影機交叉比對的麻煩問題[10]。

(14)

3

1-2 研究動機與問題

現代人生活步調繁忙、工作壓力大,加上姿勢不良、缺乏運動等,容易產生各種 類型的酸痛、而需要復健科醫生依據不同之癥狀開出不同的動作設計處方,以便進行 復健治療。然而復健的成功與否, 最重要的因素就在於需要持之以恆; 如果復健運動 能在家裡自行練習,並有正確與否的偵測與辨識,對許多人來說,能減輕往返醫療院 所的麻煩後,將更樂於復健,以便早日贏回健康。

然而一般動作偵測與辨識的設備相當昂貴,所以本論文要利用簡單的硬體設備來 做出虛擬角色動作及使用者表現效果的基本辨識引擎,作為復健遊戲開發雛型中的基 礎元件。由於最近微軟XBox360 的Kinect裝置[11]具有深度測量的紅外線攝影機,相 較目前市面上普及的Webcam,將更能準確快速的分割前景與背景與骨架追蹤,對於 動作的辨識上將比以往的研究更加準確[1-4]。此外微軟XBox360 的Kinect 裝置是運 用在遊戲上,所以售價上將會比同等級的硬體偵測裝置便宜,在做研究動作辨識的門 檻將大大的降低。

本論文利用深度值與骨架手勢辨識的來達成動作姿勢辨識的效果,並利用它們來 呈現出空間操控物件, 透過物件操控, 以達到身體「展」、「轉」、「旋」、「屈」

不同的動作設計運動 ; 其中位置與特定動作的姿勢,是本論文實作復健輔具系統的 主要辨識項目,並針對下列問題來分析對此輔具辨識比對的影響。

研究問題:

(1)深度值的判斷

(2)偵測運動時的骨架變化

(3)藉由骨架變化來讓虛擬角色呈現示範姿勢 (4)提升動作辨識的效能與即時性

(5)透過系統來分析姿勢是否正確

(15)

4

1-3 論文架構

本篇論文主要分成五個章節,第一章介紹本論文的研究動機與相關文獻探討;第 二章是所用之原理介紹與方法;第三章為本論文的系統設計與實驗方法;第四章 為 實作的成果與測試結果;第五章為結論與探討未來可改進的方向。

(16)

5

第二章 原理介紹與方法

為達到居家復健與運動訓練能夠簡便及易於施行之目的,平民價的動作偵測與辨 識設備為本論文所要選擇作為復健遊戲開發的基礎元件與軟硬體設備。

2-1 微軟 Kinet 體感應器之介紹

Kinect 體感遊戲在 Xbox 360 上一直獲得極高的好評;在 2013 年 3 月 18 日微軟 Kinect for Windows 團隊又發佈了免費軟體開發套件 SDK 1.7 版本,這是微軟自 2012 年 2 月發佈 SDK 1.0 版及 Kinect for Windows 感應器以來最重要的軟體更新。

讓企業和開發者能夠更加專注於開發更多創新的應用程式,在提升工作效率並降低成 本的同時,為零售、醫療和教育等多個行業的顧客提供更為一致、直覺和自然的體驗。

2-1-1 Kinect 體感應器之硬體描述

圖 2-1 Kinect 體感應器之硬體 Kinect 感應器可以取得以下三種資訊:[12]

彩色影像 (透過中間那顆 RGB 鏡頭)

(17)

6

3D 深度影像 (透過左右兩顆鏡頭) , 紅外線發射器和紅外線 CMOS 攝影機

聲音 (透過陣列式麥克風)

Kinect 也支援追焦功能,底座馬達會隨著焦點人物而轉動 Kinect 方向 (左右各 28度) 。 表 2-1 Kinect 的詳細規格

感應項目 有效範圍

顏色與深度 1.2 ~ 3.6 公尺

骨架追蹤 1.2 ~ 3.6 公尺

視野角度 水平 57 度、垂直 43 度

底座馬達旋轉 左右各 28 度

每秒畫格 30 FPS

深度解析度 QVGA (320 x 240)

顏色解析度 VGA (640 x 480)

聲音格式 16KHz, 16 位元 mono pulse code modulation (PCM)

聲音輸入 四麥克風陣列、24 位元類比數位轉換 (ADC)、雜音消除

(18)

7

2-1-2 Kinect for Windows 架構

Kinect 的 NUI 程式庫提供應用程式取得 Kinect 感應器傳送至主機的三種資訊串流,

分別為彩色影像串流,深度影像串流以及聲音串流 (必須在初始化 API 時指定要接 收那幾種串流) [12]:

圖 2-2 Kinect 的 NUI 程式庫 下圖就是完整的 Kinect for Windows SDK 架構圖:

圖 2-3 Kinect for Windows SDK 架構圖

Kinect 硬體包含底座的馬達、RGB 攝影機、紅外線 CMOS 攝影機、紅外線 發射器、以及陣列式麥克風。

(19)

8

Kinect 驅動程式核心模式下包含了以下驅動程式:Microsoft Kinect Audio Array Control,Microsoft Kinect Camera ,Microsoft Kinect Device 及 Kinect USB Audio.

另外還有 Kinect 的 NUI API 程式庫、麥克風陣列 DMO 編碼器,再加上 Windows 7 內建影音處理,也就是架構圖中灰色底的部分,這就是為什麼 Kinect for Windows SDK 只支援 Windows 7 及以上的主要原因了。

2-1-3 Kinect 體感應器之深度資訊

Kinect所採用的感測設備與技術,並非市面上常見的TOF(Time of flight),而是 由PrimeSense研發的Light Coding技術。Light Coding技術理論是利用連續光(近紅外 線)對測量空間進行編碼,經感應器讀取編碼的光線,交由晶片運算進行解碼後,產 生成一張具有深度的圖像。此圖像是Kinect 以人眼看不見的紅外線,透過位在鏡頭 前的Diffuser 光柵,將紅外線均勻分散於測量空間中,並由紅外線攝影機來紀錄,由 此原始資料透過晶片計算成具有3D 深度的圖像資料。

而 Light Coding 的主要技術關鍵是 Laser Speckle 雷射光散斑,當雷射光照射到粗 糙物體、或是穿透毛玻璃後,會形成隨機的反射斑點,稱之為散斑。散斑具有高度隨 機性,也會隨著距離而變換圖案,空間中任何兩處的散斑都會是不同的圖案,等於是 將整個空間加上了標記,所以任何物體進入該空間、以及移動時,都可確切紀錄物體 的位置。Light Coding 發出雷射光對測量空間進行編碼,就是指產生散斑。

Kinect 就是以紅外線發出人眼看不見的 class 1 雷射光,透過鏡頭前的 diffuser(光 柵、擴散片)將雷射光均勻分佈投射在測量空間中,再透過紅外線攝影機記錄下空間 中的每個散斑,擷取原始資料後,再透過晶片計算成具有 3D 深度的圖像。透過 Kinect 所投射出來的紅外光線,是一個錐形放射光源如圖 2-4。

(20)

9

圖 2-4 紅外線投影過程(取自文獻[1])

圖 2-5 為透過夜視設備觀看 Kinect 實際運作情況,由圖 2-6,我們可以發現該散 斑投影至一個平面時,該散斑的投射外觀由九個小型矩形拼湊成為一個 9x9 矩陣,

每一個小型矩形中央都有一個特別明亮的光點,該光點視為一個標定點,藉此計算深 度影像的前景與背景的距離,該矩陣如圖 2-6。

圖 2-5 透過夜視設備觀看 Kinect 實際運作(取自文獻[1])

圖 2-6 Kinect 所投射之 9X9 矩陣(取自文獻[1])

該紅外線之投射並非為一個完全規律的矩形。透過實驗,我們發現距離 Kinect 越近,投射於待測物體上的散斑越集中也越明顯,透過該矩陣的隨機散斑,投影至不 同距離的物體上,我們便可為不同距離之物體進行量測。

(21)

10

利用 Kinect 所投射出的紅外光線,會因為距離而影響散斑集中程度,如 圖 2-7 距離而影響散斑集中程度(取自文獻[1])

圖 2-7 (a) 圖 2-7 (b)

圖 2-7 (c) 圖 2-7 (d)

圖 2-7 (e) 圖 2-7 (f)

圖 2-7 (g) 圖 2-7 (h)

圖 2-7 (i) 圖 2-7 (j)

(22)

11 圖 2-7 (k)

圖 2-7 (a)手掌距離鏡頭 20 公分,接著以每 10 公分為間隔,拍攝至圖 2-7 (k)手掌距離 鏡頭 120 公分為止

圖 2-7 是由夜視攝影機所拍攝的紅外線投射過程,從圖中我們可以得知待測物體距離 與散斑集中的密集程度有所影響[13]。

深度影像就是由紅外線發射器和紅外線 CMOS 攝影機共同取得的動態影像畫 面透過 Kinect SDK, 可以取得下列資訊:

1. 深度資料

在深度串流的畫格中,每一個像素 (16 位元) 的資料,表示在指定的 x, y 座 標下,與最靠近感應器的物件的相對距離 (單位: mm),深度距離範圍 850mm

~ 4000mm,深度 0 則表示未知狀況,例如該位置是影子、過低反射 (玻璃)、

過高反射 (鏡子)。

o 支援以下串流

640 x 480, 320 x 240, 80 x 60

o 透過深度資料,應用程式可以

追蹤使用者的動作

標示出背景物件,並加以忽略 2. 深度資料取得

o ImageFrame.Image.Bits : 這是一個一維的 byte 陣列。

從影像的左上角開始,先從左到右,再從上到下,每一個像素 (2 bytes)

(23)

12

的格式在開啓串流時由 ImageFormat 指定,例如我們要計算深度影像 左上角像素 (0, 0) 所代表的距離:

ImageFormat.Depth

第二個 byte 左位移 8 位元

(0,0) 距離= (int) (Bits[0] | Bits[1] << 8)

ImageFormat.DepthAndPlayerIndex

在 Kinect for Windows SDK 中,Kinect 系統處理感應器資料,

標定出感應器前方兩個人的外形,並且產生玩家區段對應,這個 對應資料包含在深度資料中,其中像素的值對應到在該像素位置 下,最靠近感應器的那一個玩家的編號[14]。

2-1-4 Kinect 體感應器之骨架追蹤系統

Kinect 的骨架追蹤系統可以在感應器可視範圍內主動追蹤最多兩位玩家的骨架,

骨架追蹤系統可以在感應器可視範圍內主動追蹤最多兩位玩家的骨架,如果某一個玩 家被主動追蹤,那麼在呼叫 SkeletonEngine.GetNextFrame 時會取得該玩家完整的骨 架資訊,預設只有前兩個玩家是主動被追蹤的。背動骨架追蹤預設是啓動的,可以額 外追蹤 4 個玩家,但是由於處理速度的因素,背動追蹤下的骨架資訊有限。

NUI 骨架 API 提供最多兩個玩家的骨架位置與方向的資訊,應用程式取得的是 一堆座標的集合,稱為骨架關節位置 (skeleton joint positions),因此在初始化 NUI 時 一定要指定要使用骨架資料,並且啓動骨架追蹤[15]。

(24)

13

圖 2-8 由 Kinect 感應到的人體骨架

2-2 Kinect 之座標系統

Kinect 的座標系也跟我們平常習慣用在電腦上的座標系有所不同。我們在電腦螢幕上 習慣以左上角為起點,往右的話 X 軸的值增加,往下的話 Y 軸的值增加;不過,Ki nect 的骨架座標系統是以 Sensor 面對的方向為準,往左手邊的話則 X 軸的值增加,

往上方的話 Y 軸的值增加,而往前的話則 Z 軸的值增加。彙整如下:[16]

(25)

14 骨架座標系統(稱之為骨架空間) - 三度空間 (x, y, z)

- 單位: m - 右手座標系統

- Z 軸是感應器面對的方向 - Y 軸向上

- X 軸向左(以感應器為中心)

圖 2-9 骨架座標系統

2-2-1 Kinect 深度測量方式

和其他攝像機一樣,近紅外攝像機也有視場。 Kinect 攝像機的視野是有限的,如 下圖所示:

圖 2-10 Kinect 近紅外攝像機視場

如圖,紅外攝像機的視場是金字塔形狀的。離攝像機遠的物體比近的物體擁有更 大的視場橫截面積。這意味著影像的高度和寬度,比如 640X480 和攝像機視場的物

(26)

15

理位置並不一一對應。但是每個像素的深度值是和視場中物體離攝像機的距離是對應 的。深度幀數據中,每個像素佔 16 位,這樣 BytesPerPixel 屬性,即每一個像素佔 2 個字節。每一個像素的深度值只佔用了 16 個位中的 13 個位。如下圖:[17]

圖 2-11 Kinect 景深像素的深度值資訊

獲取每一個像素的距離很容易,但是要直接使用還需要做一些位操作。可能大家 在實際編程中很少情況會用到位運算。如上圖所示,深度值存儲在第 3 至 15 位中,

要獲取能夠直接使用的深度數據需要向右移位,將玩家者索引(Player Index)位移除。

在投影(projective)坐標系、也就是透過 Depth Generator 直接得到的深度圖上,像 素的值其實就是直接代表深度值,單位就是 mm;它所代表的意義,就是該點到 Kinect 所在的平面的垂直距離。[18]

而在透過 depth generator 的 ConvertProjectiveToRealWorld() 這個函式轉換到真 實世界(real world)坐標系的時候,其實 Z 的值是不會變的;他會根據投影座標系 統上的( X, Y, Z ) ,去計算出在真實世界坐標系的位置,理論上會是( X', Y', Z ),雖然 X / Y 的執會改變,但是實際上 Z 的值應該都是維持不變的。所以,如果只是想知道 某個點的深度,或是兩個點的深度差的話,其實不用轉換到真實世界座標系統,直接 在投影座標系統針對 Z 值做計算就可以了但是,如果是想知道兩點的距離的話,那 就還是要透過轉換的函式,把真實世界座標系統的 X / Y 算出來了[19]。Kinect 的深 度有效範圍,根據《Kinect for Windows SDK 官方中文開發教學影片》的投影片的說 法,最佳的偵測距離約為 1.2 公尺到 3.6 公尺間,水平視野為 57 度,垂直視野為 43 度,若是超出最佳偵測範圍,Kinect 的底座馬達也可驅動旋轉,來做自動追蹤系統 校正。[32]所以在已知 Kinect 攝像機的視野角度,橫軸是 57 度縱軸 43 度,z 軸:景深

(27)

16

已知下,我們就可以利用三角函數計算出目地物的高與寬。如下示意圖[20]:

圖 2-12 玩家身寬換算(取自文獻[20])

上圖舉例若已知 the pixel width of image 是 320,就可據而推算出 Wr 值,以 mm 為位。

2-2-2 各種座標空間及轉換

從 Microsoft Kinect SDK 擷取的原始的坐標數據, 在大多數情況下,是不能直 接使用的。因為骨架關節點數據、深度資料和彩色影像數據的量測方式不同。不同種 類的數據(深度數據,影像數據,骨骼數據)都是在不同的特定集合坐標或空間內定義 的。深度數據或者影像數據用像素來表示,X,Y 位置從左上角以 0 開始。深度數據的 Z 方位數據以毫米為單位。而在骨架關節空間是以米為單位來描述的,偵測出的關節 點以(x,y,z)表示,其中 x 及 y 代表人體水平(x)及垂直(y)移動平面座標,z 代表深度值,

以 Kinect 的所在位置其 X,Y 值設為 0,若距離 Kinect 越遠則 z 值越大。骨架關節空 間座標係是右手坐標系,X 軸數據范圍為-2.2~2.2,總共範圍為 4.2 米,Y 週範圍為 -1.6~1.6 米,Z 軸範圍為 0~4 米。下圖描述了 Skeleton 數據流的空間坐標系。 [21]

(28)

17

圖 2-13 Skeleton 骨架空間坐標

Kinect SDK 預設就內建了 20 個身體部位的感應點。而在 C#版的 Kinect SDK 中也很 友善的預先把這二十個點都以一個 Enum 封裝了起來,開發者只需要透過 Enum 就能 選取所要部位的該點座標值。以下為節錄自 MSDN Skeleton position 之資訊:

圖 2-14 人體骨架資訊(a)

(29)

18

圖 2-15 人體骨架資訊(b)

(30)

19

第三章系 統架構與設計

從手部活動、能提供多方向平衡感的復健、運動訓練作為系統架構與設計的發想。

3-1 復健遊戲構想

目的在於是否能達到居家復健的可行性。

3-1-1 訓練手部活動

其目的是設計一款可以刺激使用者做出控制瞄準點的連線遊戲,以加強手部活動,

也可以運用在手眼協調的訓練上。

3-1-2 訓練多方向平衡感

其目的是設計一款可以刺激使用者執行多重角度的動作姿勢,並維持身體的平衡

; 遊戲的目標則是透過使用者的操作以增進身體動作姿勢與眼腦並用,並將醫囑的 姿勢建議也一併納入。

3-2 系統架構

本論文研究利用 Kinect 的 RGB 鏡頭與紅外線散斑發射器、紅外線感測器,進行 人體部位影像距離感測,透過微軟公司釋出的 Kinect SDK(Software development kit) 軟體開發套件,擷取物體偵測相關訊息,用以增加偵測的準確性,也能降低背景複雜 度的影響。

3-2-1 軟體開發工具與環境

-軟體開發環境為 Visual Studio2010,開發語言為 C#,

-以 Microsoft .NET Framework4.0 為執行與開發環境,

(31)

20 - Kinect SDK for Windows version 1.6

3-3 系統設計

復健、運動體感遊戲引擎包含了二組遊戲設計,一為 Crayon 連連看; 二為 Pose 動作姿勢做做看遊戲。

3-3-1 系統架構圖

本遊戲引擎系統預存三種資訊內容,分別為: 點的佈陣圖庫、動作姿勢辨識庫、

摹擬示範示意庫。並提供 Crayon 連連看體感比對碰觸辨識及 Poses 手勢動作姿勢辨 識功能。

圖 3-1 復健和運動體感遊戲引擎 影像、深度、關節資

訊擷取與比對辨識 點佈局庫

動作姿勢 辨識庫

摹擬示範 示意庫

(32)

21

3-3-2 系統流程圖

本遊戲引擎系統操作提供二組遊戲選擇項目,由操作者的手勢示意決定所選項目。

Crayon 連連看遊戲所需連線的點會依序出現於螢幕上,待玩家完成所有的連線點,

本遊戲會自動結束,回到最初系統開始之遊戲選擇項目畫面。

Pose 動作姿勢做做看預存設計者提供的多組姿勢設計,玩家須完成所要求的動 作姿勢要領,或超過時間限制才會輪替到下一組動作姿勢,同樣的,本遊戲結束,會 自動回到最初開始之遊戲組選擇畫面。

(33)

22

手勢動作姿勢辨識系統流程圖

No

Yes

圖 3-2 手勢動作姿勢辨識系統流程圖 系統啟動

體感遊 戲選擇

Crayon 連連看

動作姿 勢做做看

程序完成/

時間結束

體感遊戲結束 Renew

(34)

23

3-4 比對辨識資料庫設計

本復健、運動體感遊戲引擎包含了二種主要的比對辨識戲設計,Crayon 連連看 體感碰觸比對辨識及 Poses 動作姿勢辨識。

3-4-1 Crayon 連連看體感碰觸比對辨識

在 Crayon 連連看體感遊戲中, 在畫面上布局了十四個平面座標點, 藉由空中手 勢進行從 1 依序至 2 一直到 14 再回到 1,才算完成整個連連看測試活動。回到 Game Over 畫面後,可以重新選擇是否還要繼續進行那一種測試活動。

以下為布局點畫面,連連看完成圖樣及建庫資訊:

圖 3-3 Crayon 布局點畫面

(35)

24

圖 3-4 Crayon 連連看 完成圖樣

圖 3-5 Crayon 建庫資訊 圖 3-5 為 Crayon 連連看中,點的座標分布。

(36)

25

3-4-2 Poses 動作姿勢辨識

由於身體的姿勢及所坐落的位置點會使得身體呈現一個姿勢 ; 更具體的說,這 個姿勢也會使得身體各個關節點產生相對的位置與角度。當然,姿勢類型與複雜度决 定了識别算法的複雜性。本論文手勢動作姿勢辨識是藉由手勢是否通過或碰觸到命中 測試區、是否符合相關關節點的角度及通過一定的程序測試來進行姿勢辨。

本論文參考 Begin Kinect Programming with the Microsoft Kinect SDK 文獻[22]

實作四種程序加上角度進行手勢比對與辨識及命中區命中測試。

(1)角度計算的依據原理:

骨架追踪引擎能夠識別 20 個關節點數據。而任何三個關節點就可以組成一個三 角形。使用三角幾何就可以計算出他們之間的角度。

實際上我們只需要根據兩個關節點即可繪製一個三角形,第三個點有時候可以這兩個 關節點來決定的。知道每個節點的坐標就可以計算每個邊長的值。然後使用餘弦定理 就可以計算出角度了。公式如下圖:

圖 3-6 角度計算的依據原理

為了使用關節點三角形方法來識別姿勢及簡化計算; 當測試者站得很直的時候,可以 發現,測試者肩部和肘是在一條線上並且和地面平行,手腕與肘部與胳膊垂直。這樣 的姿勢,很容易就形成一個直角或者銳角三角形。並進而可以使用上面所說的方法計 算三角形的每一個角度。

(37)

26

圖 3-7 論文中程式角度計算實作部分

當我取得了每個手部的關節座標時,我就利用這些座標以及圖 3-7 的程式來計算我所 想要的角度。

(38)

27 (2) 動作姿勢辨識程序庫

動作姿勢辨識程序庫建於系統中的內容範例:

圖 3-8 姿勢辨識程序庫

(3) 藉由骨架資訊擷取讓虛擬角色呈現示範姿勢

以下是藉由程式透過Microsoft Kinect SDK 能追蹤人體20個點的特性,將其骨架 關節距離深度感應器的XYZ的距離擷取出來,並為了計算方便,將其轉換為螢幕上的 XY平面座標,下圖即為了建立示範姿勢擷取骨架資訊螢幕上的XY平面座標的操作畫 面:

(39)

28

圖 3-9 擷取虛擬角色所需的骨架資訊

隨後將取得的螢幕關節座標資訊存起來做為建構摹擬示範姿勢的根據,如下所示 :

圖 3-10 Excel 中顯示的虛擬角色骨架資訊

(40)

29

並在程式中內建此資訊,作為示範姿勢展示之用。

圖 3-11 程式中植入虛擬角色骨架資訊 再透過程式中所建立的 Storyboard, 於操作互動中展現出來 : 如下圖的左邊下面部分:

(41)

30

圖 3-12 遊戲執行時顯現虛擬角色資訊

(4) 比對成功判定原則

比對成功判定原則是測試者的手勢相關關節點的角度需符合系統要求的四個條 件, 才會進行下一個 Level 的姿勢比對。 若比對一直不成功,則因系統內建有 Timer,

當設限時間終了,系統就會回到 Game Ove。操作者可以重新選是否要繼續進行測 試。

(42)

31

第四章 實驗與討論

由於本論文想藉由不同體感操作來探討下列問題對操作者的影響,因此本章節將 針對本論文所提出的系統依下列問題說明實驗結果。

(1)深度值的判斷

(2)偵測運動時的骨架變化

(3)藉由骨架變化來讓虛擬角色呈現示範姿勢 (4)提升動作辨識的效能與即時性

(5)透過系統來分析姿勢是否正確

4-1 Crayon 測試

Crayon 連連看在螢幕平面上共有 14 個點, 系統偵測到的手,以距離 sensor 最近 的手作為 Primary hand 執行連線動作。

if (primaryHand.Position.Z > righHand.Position.Z) { primaryHand = righHand; }

手的位置座標,透過函式 MapSkeletonPointToDepthPoint(hand.Position,

DepthImageFormat.Resolution640x480Fps30) 取得後,再依顯示窗大小而轉換座標;

DepthImagePoint point =

this.sensor.CoordinateMapper.MapSkeletonPointToDepthPoint(hand.Position, DepthImageFormat.Resolution640x480Fps30);

point.X = (int)((point.X * LayoutRoot.ActualWidth / sensor.DepthStream.FrameWidth) - (HandCursorElement.ActualWidth / 2.0));

point.Y = (int)((point.Y * LayoutRoot.ActualHeight /sensor.DepthStream.FrameHeight) - (HandCursorElement.ActualHeight / 2.0));

(43)

32

4-1-1 Crayon 測試結果

Crayon 執行的測試結果:

測試內容: Crayon 測試結果

深度值的判斷 在本案中, 深度值僅運用在 primary

hand 判斷上。

偵測運動時的骨架變化 設有 skeleton.ClippedEdges 顯示,

提醒 skeleton 哪部分超出 Sensor 視場 範圍,會有失真的風險性。

虛擬角色呈現示範姿勢 Crayon 未提供此服務。

辨識的效能與即時性 Hand Cursor 隨著手勢移動而移動,但

要實際與下一個目標點碰觸,並不容 易;

所以程式設有一個容許值,如距離小於 25 即算是目標被成功的碰觸。

透過系統來分析姿勢是否正確的效能 利用手勢即可達到虛擬環境的操作

表 4-1 Crayon 執行的測試結果

4-1-2 Crayon_Depth 考慮深度影響的測試結果

為了更方便操作者在操作上的辨識與掌控,我們將原 Crayon 的手勢代表圖像會 隨著操作者實際距離 Kinect 偵測器的遠近而變化,並將深度影響反應在計算是否碰 觸到目標的判斷上。

double z = hand.Position.Z * FeetPerMeters;

(44)

33

Canvas.SetLeft(HandCursorElement, point.X);

Canvas.SetTop(HandCursorElement, point.Y);

Canvas.SetZIndex(cursorElement, (int)(1340 - (z * 100)));

HandCursorScale.ScaleY = 6 / z;

HandCursorScale.ScaleX = 6 / z;

HandCursorScale.ScaleX = 6 / z * ((hand.JointType ==

JointType.HandRight) ? -1 : 1):

測試內容: Crayon 測試結果

深度值的判斷 深度值除運用在 primary hand 判斷

上,也顯示在 handcursor 圖像上及螢 幕畫面的層次中。

偵測運動時的骨架變化 設有 skeleton.ClippedEdges 顯示,

提醒 skeleton 哪部分超出 Sensor 視場 範圍,會有失真的風險性。

虛擬角色呈現示範姿勢 Crayon 未提供此服務。

辨識的效能與即時性 由於增加了視覺辨識性,也增強了測試

者的操作容易度,也反應在測試的統計 結果中。

透過系統來分析姿勢是否正確的效能 利用手勢即可達到虛擬環境的操作

表 4-2 Crayon_Depth 考慮深度影響的測試結果

4-2 姿勢四種程序角度辨識測試

Kinect 可以讓使用者本身就是 input device,但使用者是隨時隨地都在呈現不同 的姿勢的 ; 在甚麼樣的情況下,是需要系統辨識認為是有效的;又在甚麼樣的情況下,

(45)

34

是需要被忽略的。這就需要採用一些可以區別出來的設計方法 ; 例如較特別的姿勢 ; 或在某個姿勢停留一定以上的時間等等…。本論文採用四個程序的姿勢作為手勢辨識 判定基礎依據 ; 以右肩、右手手肘、右手手腕、左肩、左手手肘、左手手腕共六個 關節點的空間座標位置做為分析資訊,藉由以上各關節點間的相對位置產生的角度分 析是否符合主畫面上所顯示的要求姿勢作為辨識方法。因不考慮人體的軀幹、臀及頭 部等的位置。也就是只辨識上訴六個關節點手勢,其他都視同站很直,用以排除軀幹、

臀及頭部等的偏移或傾斜產生的影響。

計算方式: 採用 2 關節點座標為依據(其中一個為基準點) , 第三點的 x 座標為 一、二點的 x 相加,y 則與基準點相同,如下舉例:

圖 4-1 採用 2 關節點座標計算示意圖

b’座標 : <1431.42, 319.84, 5.66>

a=Sqrt((716.65-714.77)² + (319.84-156.75)²) b=714.77

c= Sqrt((1431.42-714.77)² + (319.84-156.75)²) θ=cos¯¹(a²+b²-c²)/(2ab)

θ= cos¯¹(-0.011) =DEGREES(ACOS(-0.011)) = 90.63027˚

(46)

35 預設的四種姿勢辨識程序庫分別為:

(1) Arms up : 左肩、左手手肘 : 180 度 左手手肘、左手手腕: 90 度 右肩、右手手肘 : 0 度 右手手肘、右手手腕: 90 度 (2) Arms down : 左肩、左手手肘 : 180 度

左手手肘、左手手腕: 270 度 右肩、右手手肘 : 0 度 右手手肘、右手手腕: 270 度

(3) Left up Right down : 左肩、左手手肘 : 180 度 左手手肘、左手手腕: 90 度 右肩、右手手肘 : 0 度 右手手肘、右手手腕: 270 度

(4) Rightt up Left down : 左肩、左手手肘 : 180 度 左手手肘、左手手腕: 270 度 右肩、右手手肘 : 0 度 右手手肘、右手手腕: 90 度 誤差寬容度: 30 度

姿勢辨識項目因為採用的是依序顯示方式,且已為測試者已知,所以從測試結果也看 出完成操作所需花費的時間即短 ; 是故可以認為是完成操作的最佳化的時間需 求 。

(47)

36

4-2-1 姿勢辨識項目由系統任意選定並取消 StoryBoard 的圖樣顯示測試

以下為測試結果:

測試內容: Crayon 測試結果

深度值的判斷 因辨識採手勢六個關節點為依據,所以

排除軀幹、臀及頭部等的偏移或傾斜所 產生的影響。所以 Z 軸未記入。

偵測運動時的骨架變化 設有 skeleton.ClippedEdges 顯示,

提醒 skeleton 哪部分超出 Sensor 視場 範圍,會有失真的風險性。

虛擬角色呈現示範姿勢 透過 StoryBoard 圖樣的示範姿勢,增

強了 視覺辨識性功能

辨識的效能與即時性 由於增加了視覺辨識性,也增強了測試

者的操作容易度,也反應在測試的統計 結果中。

透過系統來分析姿勢是否正確的效能 利用手勢即可達到虛擬環境的操作

表 4-3 姿勢辨識項由系統任意選定並取消角色示範顯示測試結果

(48)

37

第五章 強化手指方面的辨識

由於 Kinect SDK Version 1.6 並未提供手指與姿勢的辨識 , 所以想做到更細部 且彈性的區分手部動作的意思表示, 則勢必要能分辨出各個手指,這裡:參考了 Daniel James Ryan, Department of Electrical and Computer Engineering University of Stavanger 的論著[23]及 F. Trapero Cerezo 的 3D Hand and FingerRecognition using Kinect 研 究 [24], 將 手 指 之 輪 廓 辨 識 之 應 用 引 進 本 實 驗 中 . 參 考 網 頁 為 : http://kinectlibrary.codeplex.com/ , 並可找到相關程式代碼。

5-1 手指偵測方法

以下是實作手指偵測的引用, 其中,要能偵測手指, 首先要從手指輪廓辨識開始。

而後依照手部幾何上的特性找出手指及手掌部位,以下為辨識的步驟:第一步就是先找 出手部輪廓的前級搜尋處理。透過 kinect 深度影像的深度值,可以判讀每個像素點是 否落在特定的近距離內,由 yes or no,可得到影像二值化後的形狀。

實驗設定:

settings.nearSpacePerc = 0.05

像素點的深度距離若 <= (最遠距離 – 最近距離) X settings.nearSpacePerc 而且 不等於 -1 為 true

(49)

38

這二值化的像素點可進一步做雜訊除去處理, 分別是用到形態學的 Dilate 與 Erode 原 理使得手部影像更為平滑。接著將這二值化的點作分類,判定是否是屬於手部分的有 效點,若是此點的鄰近四點(上下左右)都是有效點, 則此點屬於內部區; 若此點的鄰 近點有任何一點是無效的點, 則此點為 Contour 點。而且產生三種資訊,分別為內部點 InsidePoint,邊界點 ContourPoint 表,及空心的 Contour 陣列。

由於大部分的人慣用右手, 所以上述的分類與排序, 採用右上方,由右而左與循序往 下進行,並產生出上述三種資訊 ;

(50)

39

接下來, 要進行手的輪廓辨別認定 , 所採用的方法是 Turtle Algorithm 搜尋 方格方式,將前述 Contour 影像矩陣中,依據 ContourPoint 表找出可能是手部特徵的 初 始 位 置 並 排 序 這 些 點 為 特 定 手 的 ContourPoint 點 判 斷 所 找 到 的 手 的 ContourPoint 輪廓是否為有效的手部 ContourPoint 輪廓,判斷依據是: 這個所找到 的 ContourPoint 輪廓點 需占總 Contour 點 20% 以上, 且同時此點數必須大於 22 以上, 才視為該需要處理的有效資訊。

下圖為 Turtle Algorithm 尋找及排序 Contour 點示意圖及說明[24]。

圖 5-1 Turtle Algorithm 尋找及排序 Contour 點示意圖

1

圖 5-2 Turtle Algorithm 尋找 Contour 判別式 1 2

1

1

1

0 2

1

1

3

1

1

0 2

1

1

1 2

1

1

1 0 2

1

1

3

1

0 1

2

1

1

方向:

有像素值: dir = 0;

dir = (dir + 1) % 4;

無像素值:

dir = (dir + 4 - 1) % 4;

dir: 0 Down

1 Right

2 Up

3 Left

(51)

40

在以下 CalculateFrontier 函式中, 收集到的 contour 輪廓點會透過 陣列 list 傳回至呼 叫函式。

第二步做 blob detection:依照手部幾何上的特性找出手掌部位及手指尖,首先先找出手 掌心的座標位置: 先計算個別手輪廓的最左上與最右下角的座標位置並調整一個參 數後往右下移動。

圖 5-3 手輪廓邊界右下移動示意圖

(52)

41

接下來, 將 insidePoint 點分配到個別手去, 其判斷依據即是否在個別手的輪廓的最 左上與最右下角的座標位置範圍內。 而後進行手掌心位置點的演算搜尋,搜尋方法:

依據圓內最長的距離是通過圓心的直徑,所以手掌心是所有個別手的內部點到達 contour 點 最短距離中的最長距離。

圖 5-4 手心為手掌的內切圓心(取自文獻[4])

接下來, 找出手指尖:

這裡採用曲率計算,來進行各輪廓點的曲率的曲率計算,通常指尖與凹陷處會位於 與左右鄰點曲率變化較大之處,所以利用類似走迷宮方式的演算法,追蹤觀察 edge 上 個別點,對這些個別點分別從兩邊沿邊緣走 22 個點,因此每個點會有一個起點和兩 個終點,三點可形成一夾角。接著利用兩線段的向量求出此一夾角的 cosθ

曲率的計算公式為:

圖 5-5 手部尖點角度計算

當曲率變化值小於某個臨界值時,代表此輪廓點可能是輪廓過度突起處的指尖凹陷處。

本實作在指尖判定設定之依據參數為:

(53)

42

• theta = 40 * (Math.PI / 180); // In radians k = 22;

且 Fь 與 Ff 之中間點到手掌的距離要小於 Fm 點至手掌的距離。

為減少指尖偵測運算所需耗的時間, 而且目標物為手指, 所以可以大膽的設定, 當指尖被找到後,可直接跳開一定比例的點(實驗中為 0.1 * 此手的總輪廓點數), 繼 續搜尋, 且非逐一而是跳二方式進行搜尋:

size = hands[i].contour.Count;

jump = (int) (size * settings.fingertipFindJumpPerc);

5-2 手指偵測測試展示

下圖顯示手指偵測實驗結果:

(54)

43

圖 5-6 手指偵測實驗結果 測試結果如上圖所示,可清晰的辨識出手指頭的形狀。

5-3 於手勢動作姿勢辨識系統中加入手指偵測的應用

在 [復健體感遊戲選擇] 部分, 增加了以手指偵測, 作為意思表示選擇的判斷依 據,並可以作為手指運動復健的一種方式。 實作中提供了下列判定方式:

a.任何一隻手, 如偵測到曾用五隻手指頭作意思表思,且該隻手持續 2000 毫秒維持在 3 隻手指頭以上被偵測到的姿勢,則認為此選擇判定是有效的。如 Primary hand 是左手, 則轉至 Pose ; 如是右手, 則切入 Crayon 連連看。

以下為測試圖:

(55)

44

圖 5-7 (a) 復健體感遊戲選擇

圖 5-7 (b) 由右手手指選擇偵測進入 Crayon test

圖 5-7 (c) 左手手指進入 Pose 選擇偵測區

(56)

45

圖 5-7 (d) 由左手手指選擇偵測進入 Pose test 從以上的測試, 可以發現系統能被設計的更有彈性的辨識與判斷。

5-4 新增的姿勢遊戲訓練內容:

Sport1 與 Sport2 為一般常見的較大動作的單腳姿勢外, 這裡依據台中榮民總醫 院埔里分院復健科職能治療師 羅勻婷醫師, 在肩頸酸痛的治療與復健, 所提出的肩 頸酸痛的運動治療研究裡; 引用了其中所建議的側彎牽拉運動及前區牽拉運動在遊 戲內。其中辨識的關節判定方式分別為:

(1) Sport1

//Pose 5 - Left Stand_UP

this._PoseLibrary[4] = new Pose();

this._PoseLibrary[4].Title = "Left Stand_UP";

this._PoseLibrary[4].Angles = new PoseAngle[4];

this._PoseLibrary[4].Angles[0] = new PoseAngle(JointType.ShoulderLeft, JointType.WristLeft, 180, 30);

this._PoseLibrary[4].Angles[1] = new PoseAngle(JointType.ShoulderRight, JointType.WristRight, 260, 30);

(57)

46

this._PoseLibrary[4].Angles[2] = new PoseAngle(JointType.HipCenter, JointType.Head,90, 30);

this._PoseLibrary[4].Angles[3] = new PoseAngle(JointType.HipCenter, JointType.KneeRight, 335, 30);

圖 5-8 sport1 (2) Sport2

//Pose 6 - Right Stand_UP

this._PoseLibrary[5] = new Pose();

this._PoseLibrary[5].Title = "Right Stand_UP";

this._PoseLibrary[5].Angles = new PoseAngle[4];

this._PoseLibrary[5].Angles[0] = new PoseAngle(JointType.ShoulderLeft, JointType.WristLeft, 145, 30);

this._PoseLibrary[5].Angles[1] = new PoseAngle(JointType.WristRight, JointType.WristLeft, 140, 30);

this._PoseLibrary[5].Angles[2] = new PoseAngle(JointType.HipCenter, JointType.AnkleLeft, 230, 30);

this._PoseLibrary[5].Angles[3] = new PoseAngle(JointType.HipCenter, JointType.FootLeft, 230, 30);

(58)

47 圖 5-9 sport2 (3)醫囑1

// pose 7

this._PoseLibrary[6] = new Pose();

this._PoseLibrary[6].Title = "Docter' Sport1";

this._PoseLibrary[6].Angles = new PoseAngle[4];

this._PoseLibrary[6].Angles[0] = new PoseAngle(JointType.ElbowLeft, JointType.ElbowRight, 0, 30);

this._PoseLibrary[6].Angles[1] = new PoseAngle(JointType.ShoulderLeft, JointType.WristLeft, 75, 30);

this._PoseLibrary[6].Angles[2] = new PoseAngle(JointType.ShoulderRight, JointType.WristRight, 115, 30);

this._PoseLibrary[6].Angles[3] = new PoseAngle(JointType.Spine, JointType.Head, 92, 30);

圖 5-10 醫囑1

(59)

48 (4) 醫囑2

// pose 8

this._PoseLibrary[7] = new Pose();

this._PoseLibrary[7].Title = "Docter' Sport2";

this._PoseLibrary[7].Angles = new PoseAngle[4];

this._PoseLibrary[7].Angles[0] = new PoseAngle(JointType.ShoulderCenter, JointType.Head, 105, 30);

this._PoseLibrary[7].Angles[1] = new PoseAngle(JointType.ShoulderLeft, JointType.ElbowLeft, 160, 30);

this._PoseLibrary[7].Angles[2] = new PoseAngle(JointType.ElbowLeft, JointType.WristLeft, 20, 30);

this._PoseLibrary[7].Angles[3] = new PoseAngle(JointType.ShoulderRight, JointType.ElbowRight, 290, 30);

圖 5-11 醫囑2

(60)

49

第六章 系統整合

為了考慮到維護姿勢角度辨識控制操作的方便性 , 本論文新增下列二項功能:

(1) 增設資料庫, 由關聯式資料庫系統進行姿勢角度辨識控制項目的維護。而由程式 讀取資料庫的內容。

(2) 增設骨架關節記錄與播放系統, 並可以選擇角度計算所需依賴的關節位置。

6-1 增設資料庫:

為避免重複資料浪費磁碟空間,不一致相依性會產生資料維護問題 ; 所以進行 資訊的正規劃處理。 而將此姿勢角度辨識庫設立了二個資料表及一個查詢報表,分 別如下:

6-1-1 資料庫設計

分為資料表與查詢設計:

A. PoseGroup 資料表

PoseGroup 資料表內含識別碼、PoseGroup 與 PoseTitle欄位。

圖 6-1 PoseGroup 資料表

(61)

50 B. PoseAngle 資料表

PoseAngle 資料表內含識別碼、PoseGroup、Seq、AngleFrom、AngleTo、Angle、

Thread欄位。

圖 6-2 PoseAngle 資料表

C. 查詢報表

查詢報表結果內容如圖6-3。

圖 6-3 查詢報表

(62)

51

6-1-2 資料庫讀取:

採用微軟的OLE DB(Object Linking and Embedding, Database,物件連結嵌入資 料庫,有時亦寫作OLEDB或OLE-DB)作為程式讀取資料庫的方式。OLEDB是微軟 為存取不同型別資料儲存設計的一種統一方式的應用程式介面。

6-2 增設骨架關節記錄與播放系統:

依據四種程序角度辨識的需求, 本論文設計了8個有下拉式選單的 ComboBox控 制項及可記錄與播放紀錄的控制項, 下面所示, 即為操作示意圖:

(63)

52 A. 骨架關節記錄與播放系統程式進入點

圖6-4 骨架關節記錄播放器程式進入點

B. 骨架關節記錄與播放系統畫面:

圖6-5 骨架關節記錄播放器執行實驗

(64)

53

第七章 結論與未來展望

回顧本論文目前所實做的體感測試小遊戲,裡面已具有手勢辨識、手指偵測、目 地物碰觸與選取辨識的基本 engine,已可利用 Kinect 更準確與快速的分辨手勢位置特 性,為自製復健體感遊戲找出一種方法,來實現使用者本身就是 INPUT 作為電腦的 主要輸入裝置,透過遊戲本身的舒適性、便利與可接受性, 從互動中達成復健運動的 目的。

上述之復健遊戲仍屬開發 雛形,尚未應用於臨床實驗,先以製作基礎元件與方 法可行性的提出,供臨床實驗人員參考,未來期望可實際用於醫院及居家導入,並擴 充更多的訓練內容,將各種實體復健設備虛擬化。做為復健醫療之輔助器材。

由於在許多領域都需要姿勢辨識,未來希望能更進一步擴充改良及發展,

發展成多點觸控辨識, 運用於遠距醫療與會議等。而深度影像資訊處理可 更進一步拓展延伸為3D 模型自動產生器的基礎。

(65)

54

參考文獻

[1] 張國君,“基於電腦視覺的手勢辨識系統”, 碩士論文,電機工程學系, 國立清 華大學,2005。

[2] 陳宣勝,“使用星狀骨架做人類動作自動辨識”, 碩士論文,資訊科學與工程研 究所,國立交通大學,2009。

[3] 陳稔,“追蹤人體單純運動支多項機模式比對視覺系統”,行政院國家科學委員會 專題研究計畫,資訊工程學系,交通大學,2004。

[4] 陳政陽,“實現手指辨識在虛擬滑鼠之應用”, 碩士論文,電機工程學系,國立 雲林科技大學,,2010 June。

[5] Wikipedia (2011, Feb 05). Fourier transform http://en.wikipedia.org/wiki/Fourier_transform

[6] Wikipedia 隱馬爾可敷模型 ,http://zh.wikipedia.org/zh-tw/

[7] Wikipedia (2011, Feb) OpenNI, http://en.wikipedia.org/wiki/OpenNI

[8] Wikipedia (2011, Feb) PrimeSense, http://en.wikipedia.org/wiki/PrimeSense [9] Heresy. (2011, Feb) 透過 OpenNI/NITE 分析人體骨架

http://kheresy.wordpress.com/2011/01/28/detecte_skeleton_viaa_openni_part1/

[10] 李宗樺, “Kinect 偵測深度與骨架變化辨識人體運動以棒球為例” 碩士論文,

資訊傳播工程學系(所),銘傳大學 2012。

[11] Wikipedia.(2010, Feb ) Kinect, Http://en.wikipedia.org/wiki/Kinect [12] Microsoft MSDN Kinect for Windows 開發

http://msdn.microsoft.com/zh-tw/hh367958.aspx

[13] 謝銘原,謝琮閔,莊順德 - 南台科技大學 電機工程系 以分析結構光為基礎之快速物件偵測方法

國科會計畫 NSC99-2221-E-218-021 之部份成果

[14] Kinect for Windows SDK 官方中文開發教學影片_Kinect 深度影像擷取與深度計

(66)

55

http://kheresy.wordpress.com/2011/08/25/kinect_for_windows_sdk_chinese_tutorial/

[15] Kinect for Windows SDK 官方中文開發教學影片_骨架追蹤與螢幕座標轉換 http://kheresy.wordpress.com/2011/08/25/kinect_for_windows_sdk_chinese_tutorial/

[16] Kinect for Windows SDK 官方中文開發教學影片_繪製人體骨架與多人骨架追蹤 http://kheresy.wordpress.com/2011/08/25/kinect_for_windows_sdk_chinese_tutorial/

[17] Jarrett Webb, James Ashley, ISBN 978-1-4302-4105-8 (eBook) , 2012 Beginning Kinect Programming with the Microsoft Kinect SDK, Page 49-52 [18] 博客園 Eoocy , http://www.cnblogs.com/eoocy/archive/2012/06/21/2557574.html [19] Heresy 部落格

http://kheresy.wordpress.com/2011/12/27/depth_value_of_kinect_in_openni/

[20] Jarrett Webb, James Ashley, 2012 ISBN 978-1-4302-4105-8 (eBook) , 2012 Begin Kinect Programming with the Microsoft Kinect SDK, Page 70 [21] Kinect 開發學習筆記之(七)骨骼數據的提取

http://blog.csdn.net/zouxy09/article/details/8161617

[22] Jarrett Webb, James Ashley, 2012 ISBN 978-1-4302-4105-8 (eBook) , 2012 Begin Kinect Programming with the Microsoft Kinect SDK, Chap 4,5

[23] Daniel James Ryan, Finger and gesture recognition with Microsoft Kinect 2013 Department of Electrical and Computer Engineering, University of Stavanger

[24] F.Trapero Cerezo, 3D Hand and Finger Recognition, Universidad de Granada (UGR), Spain

http://zh.scribd.com/doc/161562314/Finger-and-Hand-Tracking-With-Kinect-SDK-3 [25] http://ict.udlap.mx/people/oleg/docencia/IMAGENES/chapter4/image_42_IS548.html

(67)

56

參考文獻

相關文件

閱讀劇本 了解劇情 文學賞析 音樂欣賞 創作背景、 配器法等 不同版本 深入探討 與原著的 關係 作出評論.

宋代文化的繁榮與當時人們從文化角度吸收佛教的養分,應用

港大學中文系哲學碩士、博士,現 任香港中文大學人間佛教研究中心

 活用建築物本身擁有的磁場特性進行定位 ,因此可用來解決 上述問題。利用實驗型App取得智慧型手機地磁場感應器的數據,接著

善用走廊的空間,及 善用幼兒日常生活中 熟悉並容易找到的物

 人行行長周小川於2010年指出:資本帳可兌換的定義應可

在雲中街文創聚落中營運中的「凹凸 咖啡館」是利用當時遺留下的建築群

我們提出利用讀取器與讀取器間的距離為參數來優化利用分層移除讀取器之方法的最佳 化技術 Distance Based Optimization for Eliminating Redundant Readers (DBO) ,此方法完全