OpenNI/Kinect 的手部追蹤、處理


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 上執行…不過基本上,只要可以跑起來,都算可以做簡單的測試的~

實際上,這兩位所提供的範例,都是類似的作法。他們的處理流程,基本上都是:

  1. 使用 User Generator 的 Skeleton Capabiliy 來追蹤人體骨架,並藉此判斷手部的位置。
  2. 根據手部的位置,取鄰近的深度值,抓出手的區域。
  3. 把抓到的手部區域,透過 OpenCV 來找出手的輪廓(contour、文件) ,並簡化輪廓(文件)。
  4. 去找手的輪廓的在幾何上的「凸包」(convex hull、維基百科OpenCV 文件)、以及凹進去的點(convexity defects、OpenCV 文件)。(不過 Robert Walter 似乎沒有直接用 OpenCV 去找 convexity defects)
  5. 接下來,就可以針對找到的這些點,來做進一步的分析,藉此來判斷手是張開、還是握著了~
    而這兩位基本上都是使用區域面積的比例,來做判斷的。

大致上大概就是這樣了~詳細的實作方法,可以直接參考這兩位所提供的原始碼。

Heresy 自己也有寫類似的程式,不過還沒弄完;等寫好了,再拿來分享吧~現在是希望能不能在更進一步,去分析各隻手指的位置,進而做到更細的控制;不過,還不確定能做到什麼程度就是了。


OpenNI / Kinect 相關文章目錄

對「OpenNI/Kinect 的手部追蹤、處理」的想法

  1. Heresy 您好
    非常感謝您的文章給我帶來巨大幫助
    請問您是否有關於跌倒偵測的文章或源代碼?
    謝謝

  2. Heresy 您好,
    我測試 Robert Walter 所提供的source code,跑起來但是沒有反應,影像也只有輸出一般的Depth的圖而已,如果要追蹤手指,需要改甚麼部分嗎?!

    • 他的程式要做一定程度的修改。記得主要包括了:
      1. 不要去讀取骨架校正資料
      2. 加上 User Generator 的 Callback 註冊(他本來沒加…)

      • 讀取骨架校正資料是指不要讀骨架資料嘛!?

        我現在程式可以偵測到人,但在手舉起來,就會當掉,我測試是在
        getHandContour這個當掉!!

回覆給Kinect+OpenNI学习笔记之8(Robert Walter手部提取代码的分析) | 编程·早晨 取消回覆

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料