Home People Research Blog Courses Links Search Download
NCHC

Blog

Blog 最新文章

  1. Visual Studio 的遠端偵錯:Windows
    2021/03/24 14:45
  2. Visual Studio 2019 16.9 支援使用 OpenMP LLVM
    2021/03/03 13:52
  3. Valve 推出完全支援 OpenXR 的 SteamVR 1.16.8
    2021/02/25 09:43

Blog 最新回應

  1. 加入斜體文字...
    2021/02/07 21:06
  2. 加入斜體文字...
    2021/02/07 21:06
  3. 加入斜體文字...
    2021/02/07 21:06

Keyword 關鍵字

Oculus Rift S Vulkan Oculus CUDA VR 3d print C++11 OpenMP javascript 資料視覺化 OpenNI HTC Vive Focus OpenXR CubeX xml git PHP iFlyover C++ C++20 C++14 VR MR Qt HTC Vive C++14 C++17 3D立體 Docker HTC Vive Pro svn OpenNI2 Python 資訊地圖 ASUS Xtion HoloLens 2 Oculus Quest 2 Windows MR OpenGL 開放資料 OpenCV Pandas OpenCL 開放資料 Java Kinect OpenVR Valve Index WebGL Python Boost Docker GitLab NiTE2 Pandas

類別:技術相關 » 技術研究
文章發表|我要回應|RSS訂閱

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?如果可以的話,應該也可以解決上述的問題才對。不過,就不知道到底能不能做到了。

張貼者:heresy於2013/01/11 09:01 上午有19則回應,瀏覽次數:960次
wobuaishangdiao 於 2013/01/11 17:18 下午 回應:
你好,在进行深度图形的读取后,但是图像中,当我离摄像头很近的时候,就会有很大的阴影出现, 及在我人的旁边,有什么方法消除吗。
作者作者heresy 於 2013/01/14 10:01 上午 回應:
to wobuaishangdiao

那個基本上是光學是深度感應器先天上的限制,應該無解。
DB 於 2013/04/12 18:38 下午 回應:
你好,我完成了NITE2和OPENNI2环境的搭建,但是用Niviewer测试的时候彩色和深度图像的窗口都是空白的,使用
所有其它sample也是,但是用微软sdk时候就能够正常使用,请问这是怎么回事?
我的系统是win7 64,日文版的
作者作者heresy 於 2013/04/17 17:56 下午 回應:
to DB

這個問題應該是你的系統無法正確顯示 OpenGL 內容所造成的。
請確定你的顯示卡有支援 OpenGL,並以更新到最新版的驅動程式。
cljs0280 於 2013/04/24 20:40 下午 回應:
你好,我想问一下现在的OPENNI只能调用本机连接的Kinect设备么?如果我想使用局域网其他计算机的Kinect设备有
办法实现么?谢谢
作者作者heresy 於 2013/04/25 13:38 下午 回應:
to cljs0280
目前應該是沒有現成的方案可以完整的使用遠端的感應器。
如果真的要的話,可能可以試試看一些 USB over Network 的方案(不確定是否可行)。
lr_cgx 於 2014/05/02 20:36 下午 回應:
您好!我看了您的文章收获很大,关于深度与彩色的校准想请教您一下:
我把 Redist 資料夾下,OpenNI2Drivers 這個目錄裡面本來的 Kinect.dll取代掉 。同时把每個程式獨立的 OpenNI runtime library中的Kinect.dll也取代了。可是图像还是没有校准。
我想问的是,您蛇果这个KinectMod32.dll了吗?确实是可行的吗?
谢谢啦
作者作者heresy 於 2014/05/05 08:53 上午 回應:
to lr_cgx

當時 Heresy 試過是可以的,不過現在不確定和最新版是否相容。
或許可以試試看這個:
http://viml.nchc.org.tw/blog/paper_info.php?CLASS_ID=1&
SUB_ID=1&PAPER_ID=471
cy 於 2014/05/29 20:24 下午 回應:
你好,请问 knect校正深度影像和彩色影像,如果不能用IMAGE_REGISTRATION_DEPTH_TO_COLOR,还有什么
别的方法可以用来校正吗?
作者作者heresy 於 2014/05/30 08:26 上午 回應:
to cy

可以使用 CoordinateConverter
http://viml.nchc.org.tw/blog/paper_info.php?CLASS_ID=1&
SUB_ID=1&PAPER_ID=433


不過個人會建議使用修改過的 Kinect.dll
http://viml.nchc.org.tw/blog/paper_info.php?CLASS_ID=1&
SUB_ID=1&PAPER_ID=533
阿瑋 於 2014/08/25 15:13 下午 回應:
heresy 老師你好
Q1.請問文中的
"不過由於 OpenNI 2 的架構,是每個程式都會有獨立的 OpenNI runtime library,所以這個檔案取代的動作,也是需要
對要修改的程式,個別進行的~"

意思是什麼呢?
是指我每次要使用kinect.dll的時候都要把我的
徑redist中的kinect.dll替換掉嗎?
可是不是只要替換一次之後就可以直接呼叫替
換後的kinect.dll了嗎?

Q2.請問這邊把kinect.dll替換成kinectMod32.dll的檔
之後,是直接使用"IMAGE_REGISTRATION_DEPTH_TO_COLOR"[]
這個函式來進行校正嗎?

阿瑋 於 2014/08/25 15:16 下午 回應:
哦....上一篇有很多亂碼...為什麼

Q1.請問文中的
"不過由於 OpenNI 2 的架構,是每個程式都會有獨立的 OpenNI runtime library,所以這個檔案取代的動作,也是需要針對要修改的程式,個別進行的~"
意思是什麼呢?
是指我每次要使用kinect.dll的時候都要把我的路徑redist中的kinect.dll替換掉嗎?
可是不是只要替換一次之後就可以直接呼叫替換後的kinect.dll了嗎?

Q2.請問這邊把kinect.dll替換成kinectMod32.dll的檔案之後,是直接使用"
IMAGE_REGISTRATION_DEPTH_TO_COLOR"
這個函式來進行校正嗎?
作者作者heresy 於 2014/08/25 15:58 下午 回應:
A1.
重點是你用到的是哪一個 kinect.dll 檔。
由於 OpenNI 2 基本上的概念是每一個程式都可以有各自的 OpenNI2.dll 和對應的 Drivers,所以會需要個別替換。
但是如果你確定所有的程式都是使用同一份 dll 檔的話,那就只需要替換一個。

A2.
是的
阿瑋 因為<<不能過? 於 2014/08/26 16:41 下午 回應:
heresy 老師你好
我最近在看你寫的OpenCV_Viewer2 // http://miupix.cc/dm/NRX5QL/heresy.png(圖片)
把深度和影像放在一起顯示的那個程式

裡面一開始有一句
bool g_bUseCoordinateConverter = true;

在後面決定是不是要進行校正的程式
if( !g_bUseCoordinateConverter )
// image registration
if( devDevice.isImage....( IMAGE_REGISTRATION_DEPTH_TO_COLOR ) )
devDevice.setImageRegistrationMode( IMAGE_REGISTRATION_DEPTH_TO_COLOR );

else
cerr "This device doesn't support image registration" endl;

Q1.這樣的話 g_bUser.... 不是都會一直等於true嗎?
這樣不是就不會進去校正了嗎?

Q2.我自己寫的時候沒有把校正寫進去就偏差很多
但是老師的就沒什麼偏差 這是為什麼呢?

Q3.在執行這些程式的時候我沒有把kinect換成kinectMOD32.dll 但是還是有通過
devDevice.isImageRegistrationModeSupported
請問這樣是正常的嗎?

Q4.請問老師在寫這個程式的時候有把kinect換成kinectmod32.dll嗎?
作者作者heresy 於 2014/08/27 16:11 下午 回應:
to 阿瑋

A1.
這邊由於是範例,所以式設計的時候,可以自己決定要用哪種方法來做處理。

A2.
在 g_bUseCoordinateConverter 為 true 的情況下,程式會另外 CoordinateConverter 來對深度影像作處理,所以還是會對齊

A3.
記得是由於 kinect.dll 實作的問題,isImageRegistrationModeSupported() 永遠都是回傳 true

A4. 沒有


阿瑋 於 2014/08/28 15:58 下午 回應:
謝謝老師的回答,再請問老師一下

Q1.請問這邊使用"bool"的意義是什麼呢?
Q2.在程式運行中,g_bUseCoordinateConverter有可能會變成false嗎?
作者作者heresy 於 2014/08/28 16:47 下午 回應:
to 阿瑋

1. http://en.cppreference.com/w/cpp/language/types
2. 除非你改程式碼,否則不會。
木有昵称 於 2016/04/22 23:53 下午 回應:
老师您好,我想问的是移植2.0到Linux的可行性?我现在用的是Linux下的Fedora23操作系统,之前我已经成功将
Kinect1.0 移植过来,但是在后来由于机器使用的Kinect2.0,现在在移植过程中问题很多。我是名大四学生,kinnect的移植在整
个毕业设计中是基础的一环,后面的工作才是毕设重点。我在拜读您的文章后,感觉2.0的移植并没有想象的那么轻松。由于毕业时间
的限制,我想确定一下本科能否完成这个任务,又或者这个问题并不是我本科所能解决的。
作者作者heresy 於 2016/04/25 10:50 上午 回應:
to 木有昵称

理論上 Kinect 2 在 Linux 上有 libfreenect2 可以用,不過 Heresy 自己沒過。
https://github.com/OpenKinect/libfreenect2

-- TOP --

我要回應
* 身份  訪客 (暱稱:)
 本篇文章作者 (帳號:密碼:)
* 內容      
很高興 悲傷 震驚 疑惑 大笑 發瘋 傷心
* 留言密碼 (請輸入下方圖片中去除前、後位數的數字,共五碼。)
說明 1. * 表示必填欄位。
2. 不支援HTML Tag。
   

-- TOP --

© Visualization and Interactive Media Laboratory of NCHC, 2007 - 2021, All Rights Reserved. Contact E-mail