之前已經介紹過了微軟給 XBox 360 用的體感輸入裝置 Kinect 了;後來也陸續介紹了怎麼樣在 Windows 上,透過 OpenNI 來使用 Kinect 作一些應用(文章一、文章二)。
而接下來則是準備往技術面,來介紹一下,要怎麼樣用 C++ 來使用 OpenNI 了~不過這一篇,則是在進入到程式的部分前,先大概介紹一下 OpenNI 這個 Framework 的基本架構了。
OpenNI 簡介
首先,什麼是 OpenNI?他是「Open Natural Interaction」的縮寫,大致上可以翻譯為「開放式自然操作」;而所謂的 NI 又包含哪些東西呢?OpenNI 對自然操作(Natural Interaction,以下簡稱 NI)的定義包含了「語音」、「手勢」、「身體動作」等等,基本上就是比較直覺、操作者身上不需要其他特殊裝置的操作方式了。
OpenNI 本身則是定義了撰寫自然操作程式所需要的 API,提供一個多語言(主要是 C/C++)、跨平台的 framework;藉此提供了一個標準的介面,讓程式開發者要使用視覺、聲音相關感應器,以及對於這些資料、分析的中介軟體(middleware)時,可以更為方便。
下方則是 OpenNI 的基本架構圖:
上面的架構圖基本上分為三層,最上層是應用程式(Application),也就是我們這些程式開發者自己要撰寫的部分;最下方的一層則是硬體的部分,目前 OpenNI 支援的硬體,包含了:3D Sensor、RGB Camera、IR Camera、Audio Device 這四類。不過以目前來說,會用 OpenNI 的人,主要應該就是用 Kinect 了~而如果能有對應的驅動程式的話,其他類似的裝置,應該也是有機會可以讓 OpenNI 來存取的。
而中間這層就是 OpenNI 的部分,他除了負責和硬體的溝通外,也在自身內部預留了加上中介軟體(middleware)的空間,可以用來做手勢辨識、或是追蹤之類的處理。OpenNI 目前在 middleware 的部分,定義了下面四種元件:
-
全身分析(Full body analysis)
由感應器取得的資料,產生身體的相關資訊,例如關節、相對位置與角度、質心等等。
-
手部分析(Hand point analysis)
追蹤手的位置。
-
手勢偵測(Gesture detection)
辨識預先定義好的手勢,例如揮手。
-
場景分析(Scene Analyzer)
分析場景內的資訊,例如:分離前景和背景、地板的座標軸、辨識場景內的不同物體。
目前 PrimeSense 也已經提供了一套 NITE 當作最主要的 middleware、提供上面所列的功能;而如果有更進階的需求的話,應該也可以自己寫一套相容於 OpenNI 的 middleware 來使用。當然,也希望以後會有其他軟體廠商投入這塊來開發了。
節點(Node)
在 OpenNI 裡,他定義了所謂的「Production Node」來代表內部的基本單元,包括了硬體部分的感應器,以及 OpenNI 所提供的功能;這些 production node 分為下面三大類/層:
-
感應器相關(Sensor Related)Production Nodes
- 裝置(Device) :代表實體裝置的節點,主要是用來做這些設備的設定。
- 深度產生器(Depth Generator):產生深度資訊圖(depth-map)的節點。
- 影像產生器(Image Generator):產生彩色影像圖(colored image-maps)的節點。
- 紅外線影像產生器(IR Generator):產生紅外線影像圖(IR image-maps)的節點。
- 聲音產生器(Audio Generator):產生聲音串流(audio stream)的節點。
-
中介軟體相關(Middleware Related)Production Nodes
- 手勢通知產生器(Gestures Alert Generator):當辨識到特定的手勢時,呼叫應用程式的 callback。
- 場景分析器(Scene Analyzer):分析場景,包括分離前景與背景、識別場景內的不同物體、偵測地板。他主要的輸出會是標記過的深度資訊圖(labeled depth map)。
- 手部位置產生器(Hand Point Generator):支援手部偵測與追蹤,當偵測到手、或追蹤手的位置時,會產生一個通知訊息。
- 使用者產生器(User Generator):產生一個 3D 場景中完整、或局部的身體資訊。
-
錄製/撥放
- 錄製器(Recorder):用來記錄資料用的。
- 撥放器(Player):讀取記錄下來的資料,並撥放出來。
- 編解碼器(Codec):用來壓縮、解壓縮紀錄資料。
上面這些 Production Node 基本上都是會由不同的模組各自實作的。像是以感應器相關的部分,就是會由 OpenNI 相容的裝置提供,以目前來說,主要就是 Kinect 的驅動程式會提供這深度、影像產生的功能。而中介軟體相關的部分,則是由不同的 middleware 各自提供;不過目前的來源應該也只有 NITE 就是了。
在層級上,感應器相關的 production node 算是最底層的,由於去直接存取設備的資料,所以應用程式可以直接使用這類的 production node。而中介軟體相關的 production node 由於是靠感應器的資料來做處理的,所以他們的層級則比感應器的高一層、必須要在有感應器相關的 production node 的情況下才可以使用。
而在有了上面的這些 Production Node 後,就可以透過組合這些節點來建立所謂的「Production Chain」,並以此進行資料的處理流程。比如說要產生使用者的資料的話,就是會透過「使用者產生器」(User Generator)去存取更低層的「深度產生器」(Depth Generator);而這樣的一個節點序列,就是所謂的「Production Chain」。
能力(Capability)
OpenNI 的「Capability」機制是用來增強中介軟體和硬體裝置的彈性的;這些不同的能力都是非必要性的,各家廠商所提供的不同的中介軟體和裝置,可以自己決定要提供那些能力。而 OpenNI 則是負責定義好一些可以使用的 capability,讓程式開發者可以快速地找到符合自己需求的中介軟體或裝置。
而目前版本的 OpenNI 所支援的 capability 則如下:
-
替換視角(Alternative View)
讓各類型的 map generator(深度、影像、紅外線) 可以轉換到別的視角,就好像攝影機在別的位置一樣。這個功能可以快速地替不同的感應器產生的內容作對位。
-
裁切(Cropping)
讓各類型的 map generator(深度、影像、紅外線) 輸出結果可以被裁切、降低解析度;例如:VGA 可以裁切成 QVGA。這對效能的增進很有用。
-
畫面同步(Frame Sync)
讓兩個感應器產生結果同步化,藉此可以同步取得不同感應器的資料。
-
鏡像(Mirror)
把產生的結果鏡像(左右顛倒)。
-
姿勢偵測(Pose Detection)
讓「使用者產生器(User Generator)」可以偵測出使用者特定的姿勢。
-
骨架(Skeleton)
讓「使用者產生器(User Generator)」可以產生使用者的骨架資料。包含骨架關節的位置、並包含追蹤骨架位置和使用者校正的能力。
-
使用者位置(User Position)
讓「深度產生器(Depth Generator)」可以針對指定的場景區域、最佳化輸出的深度影像。
-
錯誤狀態(Error State)
讓節點可以回報他本身的錯誤狀態。
-
Lock Aware
讓節點可以在 context 範圍外被鎖定。詳見《Sharing Devices between Applications and Locking Nodes》。
基本上,這些 capability 許多都是只針對特定的 Production Node 才會有的(例如 skeleton 就只有 user 這類的 node 可能有);而至於那些 Production Node 有哪些 capability 呢,就是要看更細一部的資料才會知道了~
而這篇文章,也就先寫到這裡了。當然,OpenNI 還有滿多東西,Heresy 在這就暫時先跳過了~下一篇開始,應該就是會使用 OpenNI,來寫一些簡單的範例了~
參考資料:《OpenNI User Guide》
[…] 在玩 OpenNI […]
讚讚
謝謝翻譯ㄎㄎ
讚讚
這系列文章是 Heresy 自己寫的,不是翻譯喔
讚讚
[…] Kinect for Xbox 360来进行OpenNI程式的开发,但是到目前为止,市面上OpenNI真正的相容装置,其实还是只有ASUS的Xtion […]
讚讚
SO GOOD!!!THX!!!!
讚讚
[…] 在 OpenNI 1.x 的時候,OpenNI 的整個 framework 是透過類似 plug-in 的機制,讓開發者可以透過 OpenNI 所提供的標準介面,使用「中介軟體」(middleware)提供的人體偵測追蹤、手部追蹤等功能(詳細介紹請參考以前的介紹);不過在 OpenNI 2 的時候,為了簡化架構、增加開發的彈性,所以把這個架構移除了。 […]
讚讚
[…] OpenNI 這個深度感應器的開發框架,在今年五月更新到 1.5.4.0 unstable 之後,就一直沒有動作了;相較於微軟 Kinect for Windows SDK 的進化,說實話,還真的讓人滿擔心他的後續發展的。 […]
讚讚
[…] Heresy 自己主要在使用、開放並且跨平台的 OpenNI 外,微軟自己也推出了 Kinect for Windows SDK,讓使用者可以在 Windows 環境進行 […]
讚讚
[…] 體感應用研習工作坊」的 OpenNI 基礎課程。而現在,也已經敲定,要在 11/17 […]
讚讚
[…] Heresy 自己是使用 OpenNI、而非 Kinect for Windows SDK,所以可能也不會下去試的。 […]
讚讚