OpenNI 2 對 Kinect 的支援


這篇,基本上針對目前的 OpenNI 2.0(2.0.0.29/2.0.0.32),稍微談一下對於 Microsoft Kinect 感應器的支援的東西。

OpenNI 1.x 的時代

首先,在 OpenNI 1.x 的時代,OpenNI 官方其實只有支援 ASUS Xtion 系列的感應器,如果要使用 Microsoft Kinect 感應器的話,是需要透過第三方驅動程式 SensorKinect 來支援的;而由於微軟後來自己也推出了 Kinect for Windows SDK,同時也針對 Kinect 感應器,推出了官方版的驅動程式,所以導致 OpenNI 1.x 和  Kinect for Windows SDK 需要使用不同的驅動程式,也因此無法同時使用。而 Heresy 也有寫過一篇《強制更換 Kinect 的驅動程式(for OpenNI)》,來說明如何針對 OpenNI,強制更換感應器的驅動程式。

當然,要同時使用 OpenNI 1.x 和 Kinect for Windows SDK 也還是有辦法的,那就是不要使用 SensorKinect  這個第三方驅動程式,而是透過 kinect-mssdk-openni-bridge 這個 OpenNI 1.x 的模組,來透過 Kinect for Windows SDK 存取感應器的資料。


OpenNI 2 的現況

到了 OpenNI 2,由於架構整個改了,而對於 Kinect 的支援方式,也做了很大的修改。他由本來是由第三方驅動程式來支援,變成了是官方直接支援;而使用的方法,則變成和 kinect-mssdk-openni-bridge 一樣,是透過 Kinect for Windows SDK 來讀取感應器的資料。也因此,在 OpenNI 2 的架構下,如果要使用 Kinect 的感應器的話,是需要安裝 Kinect for Windows SDK 的。

會這樣做的原因,個人認為主要應該是微軟對 Kinect 感應器本身的授權問題(包含之前 1.x 沒有官方版驅動程式,應該也是同樣的原因)。而帶來的影響呢?在好的方面,就是現在 OpenNI 2 所需要的驅動程式,和 Kinect for Windows SDK 是相同的,所以兩者可以直接同時使用,不用有任何衝突、也不需要做任何驅動程式、或是設定上的調整。(不過把 Xtion Pro Live 和 Kinect 感應器同時接上電腦,似乎還是會有問題)

而在比較不好的方面呢?第一個問題,就是作業系統不再那麼地彈性了~OpenNI 1.x 基本上可以在 Windows、Linux、Mac OS X 上使用 Kinect 和 Xtion 感應器,相當地彈性。但是由於 OpenNI 2 是透過 Kinect for Windows SDK 來支援 Kinect 感應器的,所以使用環境就必須要能支援 Kinect for Windows SDK 才行;也就是,現在如果要透過 OpenNI 2 來使用 Kinect 感應器的話,系統需求就是 Kinect for Windows SDK 的系統需求。也就是說就算不管硬體的部分,作業系統現在一定得要使用 Windows 7 或 Windows 8,才可以使用 OpenNI 2 + Kinect 這個組合了

那 Mac OS X、Linux,或是 Windows XP、Vista 的使用者呢?很遺憾的,目前以官方的方案來說,是無法使用 Kinect 感應器的。所以對 Kinect 的使用者來說,OpenNI 2 的平台選擇的自由度,應該算是被縮小許多…(對於 ASUS Xtion 系列用戶沒有影響就是了)

除了作業系統的部分,在使用上的功能性的部分,由於是透過 Kinect for Windows SDK 來做存取,所以自然也就會受限於 Kinect for Windows SDK 的功能,不會像對華碩 Xtion 系列支援的那麼完整。目前 Heresy 發現最糟糕的一點,就是用來校正深度影像和彩色影像的 IMAGE_REGISTRATION_DEPTH_TO_COLOR 這項功能(參考《OpenNI 2 VideoStream 與 Device 的設定與使用》),在目前的版本是無法套用在 Kinect 上的!這點對於要把彩色影像和深度影像結合做處理的人來說,其實是相當糟糕的一件事啊…

由於上面提到的這兩個問題都相當地嚴重,所以其實官方論壇上也都有相關的討論、以及可能的解決方案。


作業系統的問題

像是無法在 Linux、Mac OS X 上使用 Kinect 的問題,在《About Kinect support on Mac/Linux》一文中就有提到,現在已經有一位叫做 piedar 的網友,有做了一個 OpenNI 的分支,試著透過 freenect(連結),來做到在 Linux 以及 Mac 平台上,對 Kinect 感應器的支援。

這個分支的版本在:https://github.com/piedar/OpenNI2/tree/FreenectDriver,目前也有在官方的 Pell Request 內(參考《Freenect Driver》)。

由於 Heresy 本身是沒有在 Windows 以外的平台上使用,所以並不確定他的進度,或許有興趣、或是有需要的人可以玩看看。


深度、彩色影像的校正

而深度影像和彩色影像對位的問題,基本上可以參考《How can I align with Kinect?》這個討論串。裡面 tomoto 這位網友,就有針對官方的模組做修改,寫出一個有支援的版本了~他有提供編譯好的檔案,放在 https://github.com/tomoto/OpenNI2/tree/develop-kinect-driver-image-registration-binary/Vault,讓使用者可以很方便地下載來使用。而作者也有把這個修改給 OpenNI 官方(參考《Prototype of image registration support for Kinect driver》),就看之後的更新會不會整合進來吧~

這個網頁進去後,可以看到 KinectMod32.dll下載連結)和 KinectMod64.dll下載連結)兩個檔案,前者是 32 位元的版本,後者則是 64 位元的版本。要使用也很簡單,只要針對不同的版本下載之後,把檔案重新命名成為「Kinect.dll」,取代掉 Redist 資料夾下,\OpenNI2\Drivers 這個目錄裡面本來的 Kinect.dll 就可以了。

不過由於 OpenNI 2 的架構,是每個程式都會有獨立的 OpenNI runtime library,所以這個檔案取代的動作,也是需要針對要修改的程式,個別進行的~


這篇大概就先這樣了。接下來如果有發現什麼功能是在 Kinect 上要特別處理的,就在另外寫吧~

不過,Heresy 自己也在想…基本上,OpenNI 1.x 和 OpenNI 2 應該是可以並存的,或許也可以考慮寫出可以寫出一個客製化的 driver 模組,透過 OpenNI 1.x 來使用 Kinect?如果可以的話,應該也可以解決上述的問題才對。不過,就不知道到底能不能做到了。


OpenNI / Kinect 相關文章目錄

對「OpenNI 2 對 Kinect 的支援」的想法

  1. heresy大大

    請問大大有沒有看過關於kinect的焦距呢?
    最近想要使用kinect的焦距,但是找不到相關的規格

    或是 可以用什麼樣的方式去計算呢?

  2. 老師您好,我是一個碩士的學生,對於一本 Arduino and kinect的書裡面所談及的內容非常有興趣,遂嚐試研究(書中以OpenNI做開發),與此同時,也嘗試性的看了另一本Hacking the kinect的書,其中,在Hacking the Kinect裡 他對於OpenKinect開發推崇備至,其原因在於所提及的-1.跨平台 2.資源碼完全開放

    我最後的目標,是希望能以自己找文章寫出的演算法,使Kinect能使用我撰寫的手勢辨識去做判讀,我仍然能使用OpenNI完成我最後的目標嗎?是有聽說過NITE並非開放原碼的,這有影響嗎?或是,我必須要使用OpenKinect才能完成此一目標?誠摯的希望老師能給我一點建議

    • 這邊的問題,主要應該在於:你希望 OpenNI 幫你做那些事?希望拿到哪些資訊?開放原始碼真的是有必要的嗎?

      基本上,OpenNI 提供的,是深度感應器(Kinect)的資料處理,包含深度資訊和彩色影像。
      而 NiTE 提供的,則是手部追蹤、人體骨架追蹤等進階的分析功能。

      NiTE 的確是沒有開放原始碼沒錯,但是相對的,OpenKinect 也沒有提供這部分的功能(沒記錯的話)。

      如果你的手勢辨識是打算從深度影像開始、連手部的追蹤一起做的話,那單獨使用 OpenNI 或 OpenKinect 應該都不會有問題。

      但是如果你希望拿到追蹤到的手部位置的話,那應該還是只能靠 OpenNI + NiTE 了。

      • 感謝老師的建議 我的做法是朝"從深度影像開始、連手部的追蹤一起做" 題外話說一下 OpenKinect個人覺得安裝好困難喔-.- 我的作業系統是 windows,照著書上的指引裝了Git、Cmake還抓了至少4 5個安裝相關的東西….然後在這堆配方下…結果竟然是無法使用…然後面對這堆亂糟糟的東西 完全不知道問題出在哪裡..

        • 如果你只是要讀取深度影像的話,那 OpenNI 在入門上應該會比 OpenKinect 簡單不少。
          OpenKinect 的 libFreenect 要安裝起來的複雜度,遠比 OpenNI 高很多。

  3. 不好意思 我想請教一下 我的Kinect有安裝OpenNI2.X、PrimeSense、NITE、Kinect for Windows SDK v1.8,但是我執行Unity3D 官方商店提供的OpenNI2.X範例 他卻說我的電腦沒有安裝OpenNI
    請問是我哪邊用錯嗎?

    • 個人沒有在使用 Unity,不過個人會建議:
      1. 請先確認 OpenNI 的 NiViewer 可以正確地看到畫面
      2. NITE 提供的範例可以正確執行
      3. 確認 Unity 的相關說明

  4. […] 在 OpenNI 2 開推出的時候,或許是由於剛開始透過 Kinect for Windows SDK 來存取 Kinect 感應器吧?所以第一個版本對於 Kinect 的支援其實滿差的,不但 Kinect 感應器的特殊功能都不支援,連基本的 mirror、深度/彩色影像的對位也都不能用。(參考《OpenNI 2 對 Kinect 的支援》) […]

  5. […] 而由於 GrabDetector 會使用彩色影像來做輔助分析,所以一定要把彩色影像和深度影像,透過 Device 的 setImageRegistrationMode() 來做位置校正的處理。也因此,如果是使用不支援 setImageRegistrationMode() 的 Kinect 感應器的話,就需要使用第三方修改過的 Kinect.dll 模組才行了(參考)。 […]

  6. 請問 Kinect 在 OpenNI2 裡面要如何開啟 nearmode? 是否預設就開啟了? 還是要自己設定 property?

發表留言

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