OpenNI 2 簡介


OpenNI 終於推出整個架構做了很大改變的 OpenNI 2.0 了!而這一篇,Heresy 基本上就徹底捨棄之前 OpenNI 1.x 的架構,從頭來介紹一下全新的 OpenNI 2.0 吧~雖然或多或少會提及到 OpenNI 1.x 的東西、並做比較,不過 Heresy 會盡量寫成沒接觸過 OpenNI 1.x 的人,也可以看懂。

OpenNI 簡介

OpenNI 是「Open Natural Interaction」的縮寫,大致上可以翻譯為「開放式自然操作」;而所謂的 NI 又包含哪些東西呢?OpenNI 對自然操作(Natural Interaction,以下簡稱 NI)的定義包含了「語音」、「手勢」、「身體動作」等等,基本上就是比較直覺、操作者身上不需要其他特殊裝置的操作方式了。

而 OpenNI 則是一個開放原始碼(Open Source、目前授權採用 Apache License)、跨平台(Windows, Linux)的程式開發框架(framework),他定義了一套存取、控制深度感應器的標準介面,讓開發者可以用統一的方法,來完成基於深度感應的各項操作。目前這個標準基本上是由 Microsft KinectASUS Xtion 這兩系列感應器的核心元件(PS1080)的製造廠商、PrimeSense(官網),以及華碩(官網)等公司所組成的組織,來進行維護的。

在 OpenNI 1.x 的時候,OpenNI 的整個 framework 是透過類似 plug-in 的機制,讓開發者可以透過 OpenNI 所提供的標準介面,使用「中介軟體」(middleware)提供的人體偵測追蹤、手部追蹤等功能(詳細介紹請參考以前的介紹);不過在 OpenNI 2 的時候,為了簡化架構、增加開發的彈性,所以把這個架構移除了。

也因此,OpenNI 2.0 的架構與功能就變得相對單純,他現在只負責提供應用程式、函式庫和硬體上的溝通,讓程式開發者可以透過 OpenNI 來取得深度感應器的各項資料;至於取得資料後,要做那些處理?OpenNI 就不管了~

右圖就是 OpenNI 2.0 的架構圖。綠色的部分,就是 OpenNI 所提供的功能。雖然在其左上方,還是有一塊所謂的「Middleware Libraries」,但是實際上,這邊的 middleware library 和 OpenNI 1.x 的 middleware(主要是 PrimeSense NiTE)的意義已經大不相同了~

OpenNI 2.0 的 middleware library 基本上可以視為是一個「會透過 OpenNI 去存取感應器、進行後續處理的函式庫」,OpenNI 的架構並沒有去定義 middleware library 會有那些功能、要有那些介面;所以,在 OpenNI 2.0 的 middleware library 在開發上會相當地自由、功能也可以自由發揮~這部份的設計理念,可以參考官方的《Middleware Library Guidelines》。

但是相對的,各家 middleware 的介面也不會有一個統一的標準,開發者必須要針對個別的 middleware library 去學習它的使用方法,不像在 OpenNI 1.x 的時候,只要了解 OpenNI 的介面,就可以操作所有 middleware 了

而在開發語言上,OpenNI 2.0 目前還在 beta 版階段,所提供的 API 目前只有 C / C++(C 似乎還沒有對應的文件);不過在 OpenNI 1.x 的時候,他還有提供 .Net Framework、Java 的 wrapper,所以或許可以期待,等到 OpenNI 2.0 的正式版推出的時候,OpenNI 還是會保有他多語言的特性吧?


安裝

由於架構和功能都變單純了,所以 OpenNI 2.0 的安裝相較於 OpenNI 1.x,算是簡化了一些。基本上,只要到官方的下載頁面(連結),下載對應的 OpenNI SDK 並進行安裝就可以了;他的 32 位元和 64 位元版是獨立的,可以視需要選擇要安裝的版本。而以目前來看,OpenNI 1.x 和 OpenNI 2.0 也是可以同時安裝、使用的

在硬體的部分,如果是使用 ASUS Xtion 系列的感應器,或是 PrimeSense 自家的感應器這類直接被 OpenNI 支援的感應器的話,OpenNI SDK 本身就包含了必要的驅動程式了(預設路徑:C:\Program Files\OpenNI2\Driver~再加上 OpenNI 2 現在的硬體存取架構,也變成是去直接存取硬體,所以也就不像 OpenNI 1.x 的時候,還需要另外安裝驅動程式的模組了。

而如果是要使用 Microsoft Kinect for Xbox 360 或是 Kinect for Windows 感應器的話,由於 OpenNI 2.0 現在是透過微軟官方的 Kinect for Windows SDK官網、介紹)來做支援的,所以如果是要搭配微軟 Kinect 感應器來使用 OpenNI 2.0 的話,是需要先安裝 Kinect for Windows SDK 的(目前應該是需要最新的 1.6 版~也因為這樣,所以 OpenNI 2 + Kinect 這樣的搭配,也只能用在 Kinect for Windows SDK 的系統上,也就是 WIndows Vista 以後的 Windows 作業系統了!如果是 Windows XP 或 Linux,在現階段應該都是還沒辦法使用的…

而之前的 SensorKinect 也由於是針對 OpenNI 1.x 開發的,所以在 OpenNI 2.0 的環境下,是不需要、也無法使用的。至於之後會不會有類似 SensorKinect 這樣的第三方驅動程式,讓 Kinect 可以在沒有 Kinect for Windows SDK 的環境下使用,就要再等等看了。

至於 middleware 的部分,由於在 OpenNI 2.0 的架構下,所有 middleware library 都是各自獨立的,各自的安裝方法、使用方法,也都不盡相同;所以這部分,就是要視各自的需求而決定要安裝那些東西了~Heresy 之後應該會再花些時間,來介紹一些 middleware library 吧。

最後要注意的是,舊有使用 OpenNI 1.x 的程式,如果要繼續使用的話,也是需要安裝 OpenNI 1.x 的版本的~單純安裝 OpenNI 2.0,是無法讓舊的程式使用的。


相關文件

要怎麼開始 OpenNI 2.0 的程式開發呢?在官方網站上,OpenNI 就有提供了《OpenNI Programmer’s Guide》以及《Get Started》等文件,可以供新入門的人做參考。而對於舊版 OpenNI 1.x 的用戶,也可以參考《OpenNI Migration Guide》來做學習。

而除了文件外,OpenNI 2.0 在安裝的目錄(預設會是 C:\Program Files\OpenNI2\)下,有一個 Samples 的目錄,裡面有提供一些範例,可以作為參考。

不過,Heresy 自己看了一下後,也必須說:或許是由於 OpenNI 2.0 目前還是 Beta 版(2.0.0 Build 29),所以不管是功能、文件或是範例,都沒有 OpenNI 1.x 來的齊全;而部分文件上,似乎也有一些不一致性,像是在《OpenNI Programmer’s Guide》裡有提到,OpenNI 有提供一個 getDeviceInfoList() 的函式,可以用來取得系統上的裝置列表,但是實際上應該是沒有這個函式,而是需要使用 enumerateDevices() 才對…

不過雖然還是在 beta 中,可能部分功能不是很完備,OpenNI 2.0 現在除了 PrimeSense 自己的 NiTE 2 之外,也已經有不少協力廠商,有推出各種不同功能的 middleware library 可以使用了~所以如果有需要的話,應該還是可以玩看看的~

但是,是否要在這個時間點就徹底地從 OpenNI 1.x 跳到 2.0,Heresy 是覺得可能要自己針對個別狀況評估看看了。


基本程式架構

在 OpenNI 2.0 的核心架構的部分,由於他的功能已經做了相當程度的縮減,主要的功能只剩下裝置的管理、以及原始資料的讀取(深度、紅外線、彩色影像,似乎還不支援聲音),所以在架構上,比之前的 OpenNI 1.x 簡單許多。

如果要在 C++ 開發 OpenNI 2.0 的程式的話,基本上就是要 include OpenNI.h 這個 header 檔;所有 OpenNI 相關的東西,基本上都是在 openni 這個 namespace 之下。和 OpenNI 1.x 使用 xn 作為 namespace,OpenNI 2 算是比較直覺的。

而在 OpenNI 2.0 的架構,如果要去存取感應器的話,主要要控制的東西,只剩下四個類別:

  1. openni::OpenNI

    他基本上是一個 OpenNI 整體環境控制的類別,在概念上類似 OpenNI 1.x 的 context,主要是用來做裝置(device)的取得。
    由於他的所有成員函式都是 static 的,所以在使用的時候不需要實體化變數出來。

  2. openni::Device

    針對每一個連接到電腦上的感應器,都要用一個 Device 的物件,來做控制。而他最基本的功能,就是用來取得資料流(stream)。

  3. openni::VideoStream

    感應器的視訊資料流的類型。感應器的各種資料,例如深度、彩色影像,都各自對應到一個 VideoStream 的物件;在概念上,就相當於 OpenNI 1.x 的 MapGenerator。在系統內,要從 Device 來建立各自的 VideoStream

  4. openni::VideoFrameRef

    透過 VideoStream 取得的個別時間點的畫面。除了影像的原始資料外,還包含了必要的 metadata。

當然,實際上 OpenNI 還有提供一些額外的類別,可以在必要的時候使用;不過在一般的狀況下,主要都是透過這四個 OpenNI 提供的 class,來可以完成資料讀取的操作。


這篇算是 OpenNI 2.0 的第一篇教學文章,就先寫到這裡了。基本上,都還是概念性的東西,等下一篇,就會真正開始講程式的撰寫的部分了~而等東西都差不多了,應該會也試著整理新的投影片,再來看看什麼時候可以來開 OpenNI 2.0 的課程吧~


OpenNI / Kinect 相關文章目錄

廣告

對「OpenNI 2 簡介」的想法

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.