OpenNI 搭配 NITE 雖然提供了全身的骨架追蹤功能,但是他並沒有提供針對手部的細部處理,緊緊有提供手部的位置追蹤、以及幾組預設的手勢辨識的能力(參考)。而由於手部動作的分析、尤其是去抓出手指、或是判斷手是否握著,在互動操作上也是相當實用的功能,所以實際上也有不少人在往這方面做研究~
像下面這段影片,就是透過 model-based 的 3D 物件追蹤,來時做出來的手指追蹤,看起來效果算是相當地好!
這個研究的官方網頁是:http://cvrlcode.ics.forth.gr/handtracking/,在上面除了有相當多的影片可以參考系統運作的狀況外;一隻手有 26 個自由度(dergee of freedom)、不需要任何特殊的標誌或手套,也不需要 NITE 提供的追蹤功能。而為了計算效能,需要有支援 nVIDIA CUDA 的顯示卡來做計算;在 Intel Core i7 950 搭配 GeForce GTX 580 的情況下,處理的效能大約可以到達 20FPS。
而雖然沒有提供原始碼,不過也有提供 64 位元版本的展示程式,可以讓使用者下載測試。但是很遺憾的是,Heresy 下載後沒辦法正確執行就是了(錯誤似乎是在 CUDA 程式的部分)。
上面的方法,基本上算是去完整地去找出整個手的架構、進行手指的辨識以及追蹤,算是難度比較高的方法。而相較之下,雖然沒有那麼完整,但是還有一些比較簡易的方法,也可以做到一定程度的效果;像是在網路上,其實就可以找到不少人,把 OpenCV 拿來搭配 OpenNI 的深度資料(參考),進行簡單的手部的處理~像下面這兩段影片,都是類似的概念:
第一段影片是由 Robert Walter 這位網友所提供的,他在說明的地方,有提供 DropBox 的下載連結(ZIP 檔),可以下載原始碼來做測試;而後者則是由 Brandt Westing 這位網友提供的,他有將程式放在 github 上(連結),讓大家可以下載~
不過,Heresy 自己測試的時候,Robert Walter 的程式碼要能正確地在 Visual C++ 編譯、執行,是需要適度地修改的;而 Brandt Westing 的範例,則是不知道為什麼,可以在 Kinect for Xbox 360 上使用,而不能在 ASUS Xtion Pro Live 上執行…不過基本上,只要可以跑起來,都算可以做簡單的測試的~
實際上,這兩位所提供的範例,都是類似的作法。他們的處理流程,基本上都是:
- 使用 User Generator 的 Skeleton Capabiliy 來追蹤人體骨架,並藉此判斷手部的位置。
- 根據手部的位置,取鄰近的深度值,抓出手的區域。
- 把抓到的手部區域,透過 OpenCV 來找出手的輪廓(contour、文件) ,並簡化輪廓(文件)。
- 去找手的輪廓的在幾何上的「凸包」(convex hull、維基百科、OpenCV 文件)、以及凹進去的點(convexity defects、OpenCV 文件)。(不過 Robert Walter 似乎沒有直接用 OpenCV 去找 convexity defects)
- 接下來,就可以針對找到的這些點,來做進一步的分析,藉此來判斷手是張開、還是握著了~
而這兩位基本上都是使用區域面積的比例,來做判斷的。
大致上大概就是這樣了~詳細的實作方法,可以直接參考這兩位所提供的原始碼。
Heresy 自己也有寫類似的程式,不過還沒弄完;等寫好了,再拿來分享吧~現在是希望能不能在更進一步,去分析各隻手指的位置,進而做到更細的控制;不過,還不確定能做到什麼程度就是了。
[…] 另外,其實如果純以 OpenNI 的深度圖,搭配 OpenCV,其實也可以針對手部做一些分析(參考),真的要的話,應該也可以做到一定的程度地辨別?或許之後試試看能不能拿這個方法,來便是手是否是張開的吧~ […]
讚讚
Heresy 您好
非常感謝您的文章給我帶來巨大幫助
請問您是否有關於跌倒偵測的文章或源代碼?
謝謝
讚讚
抱歉,Heresy 沒做過這方面的研究。
讚讚
謝謝您的回复
讚讚
[…] heresy博文:https://kheresy.wordpress.com/2012/08/23/hand-processing-with-openni/ […]
讚讚
[…] heresy博文:https://kheresy.wordpress.com/2012/08/23/hand-processing-with-openni/ […]
讚讚
Heresy 您好,
我測試 Robert Walter 所提供的source code,跑起來但是沒有反應,影像也只有輸出一般的Depth的圖而已,如果要追蹤手指,需要改甚麼部分嗎?!
讚讚
他的程式要做一定程度的修改。記得主要包括了:
1. 不要去讀取骨架校正資料
2. 加上 User Generator 的 Callback 註冊(他本來沒加…)
讚讚
讀取骨架校正資料是指不要讀骨架資料嘛!?
我現在程式可以偵測到人,但在手舉起來,就會當掉,我測試是在
getHandContour這個當掉!!
讚讚
1. 是指 LoadCalibrationDataFromFile() 這個函式
2. Heresy 這邊沒碰到問題,建議自己試著用 debug 模式,進去看是怎樣死的
讚讚
測試完是在 approxPolyDP 這個死的!!
讚Liked by 1 person