在 OpenNI2 環境使用 Webcam 來讀取彩色影像:WebCam4OpenNI2


之前 Heresy 有寫了一篇《OpenNI 2 的 Driver 模組(概念)》,大概講了要怎麼去實作 OpenNI2 的驅動程式模組的概念;而這一篇的東西,就是實作的結果了!

基本上,Heresy 自己算是以半試驗的性質,搭配 OpenCV、寫了一個「WebCam4OpenNI2」的 OpenNI 2 驅動模式模組,讓 OpenNI 可以把系統上一般的 webcam(攝影機),當作一個 Device 來看,並可以建立一個用來讀取彩色影像的 VideoStream

雖然目前還有一些問題,功能也還不全,不過基本上算是堪用了,所以這邊算是第一個公開版本吧~檔案 Heresy 把它放在 GitHub 上,連結是:

https://github.com/KHeresy/WebCam4OpenNI2

使用

如果只是單純要使用的話,請下載 Binary 目錄下的 DLL 檔(連結),放到 \OpenNI2\Drivers 的目錄下就可以了。其中,OpenCVCamera32.dll 是 32 位元(win32、x86)的版本,OpenCVCamera64.dll 則是 64 位元的版本,請根據自己的環境來使用。

\OpenNI2\Drivers 則是 OpenNI 2 放置驅動程式模組的路徑,理論上每個 OpenNI 2 的應用程式目錄下,都會有這個路徑;預設的情況下,底下會有 PS1080.dllOniFile.dllKinect.dll 這三個官方提供的檔案,只要把 OpenCVCamera32.dllOpenCVCamera64.dll 和他們放在一起就可以了。

檔案準備好之後,OpenNI 2 就會去確認系統上是否有 OpenCV 支援的影像擷取裝置(包含 Webcam 或影像擷取卡),如果有的話,就會被登記在 OpenNI 2 的環境裡,可以用來建立、並產生彩色影像的 VideoStream;再接下來,就可以用 OpenNI 2 的標準操作流程,來讀取 webcam 的畫面了~

不過要注意的是,由於一般的攝影機只能提供彩色影像,所以這個驅動程式模組所建立出來的裝置,並不能用來讓其他需要深度影像的 middleware library(例如 NiTE)來使用!也就是說,並不是有了這個模組和 webcam,就不需要 Kinect 或 Xtion 這類的深度感應器了,這完全是兩回事。

另外,在 Heresy 的系統上,這個驅動程式建立出來的 Device 優先序似乎比 Xtion 高,所以如果電腦上同時有接上 Webcam 和 Xtion 的話,用 ANY_DEVICE 來開啟裝置會優先使用 Webcam,這可能會造成一些問題;要解決的話,請參考下面設定的部分。


設定

由於 OpenCV 和 OpenNI 2 本身的一些限制,所以在使用上,可能會有一些問題;而為了克服這些問題,所以 Heresy 是把 WebCam4OpenNI2 設計成會去讀取「OpenCVCamera.ini」這個設定檔,在裡面可以針對需求,做一些控制。

Heresy 有放一個範例在 GitHub 上:

https://github.com/KHeresy/WebCam4OpenNI2/blob/master/OpenCVCamera.ini

如果要使用的話,只要把這個檔案和 OpenCVCamera32.dllOpenCVCamera64.dll 放在一起就可以了。

裡面的設定,包括了四項:

  • device_name

    這個設定值,是設定建立出來的 Device 的 URI 的 prefix,後面會再加上編號。這邊預設的值是「\OpenCV\Camera\」、所以系統上第一個可以用攝影機的 URI 就會是「\OpenCV\Camera\1」。

  • list_device

    設定是否要立刻把裝置登記到 OpenNI 2 的環境,如果是 0 的話,代表不要。
    在設定為 0 的情況下,OpenNI::enumerateDevices() 將無法列出 WebCam4OpenNI2 提供的 device、而使用 ANY_DEVICE 建立 Device 的時候,也不會去使用 WebCam4OpenNI2 的裝置。
    在這個情況下,要建立 WebCam4OpenNI2 的裝置,唯一的方法就是手動指定 URI。

  • max_device_num

    由於 OpenCV 無法得知系統上有多少可以使用的裝置,所以並須以用測試的方法,把每個編號逐一去做測試、確認上限是多少、在這邊可以去限制最多要測到多少。
    (之所以加上這個的原因,是不知道為什麼,Heresy 的 SVZ13 上的 Webcam 會出現無限多次…)

  • test_mode

    由於 OpenCV 沒辦法取得支援的解析度列表,所以這邊必須自己去把有可能有支援的模式,都先列出來。寫的格式則是「width/height@FPS」;這項設定允許重複出現,以設定各種不同的解析度。
    而雖然 Heresy 在內部有試著去做指定的模式是否支援的測試,不過目前的寫法似乎有問題,沒辦法真的發揮過濾的功能,所以所有設定的模式,都會出現在支援列表中,但是實際上不一定可用。


自行建置

Heresy 有在 GitHub 上提供原始碼,所以想要自己修改、建置的話,可以直接參考原始碼來使用。雖然 Heresy 自己只有在 Windows 平台上測試,不過由於都是採用跨平台的東西,所以在其他平台應該也是可以用的。而基本上,只要有「OpenCVCamera.cpp」和「OpenCVCamera.vcxproj」這兩個檔案就可以了(如果是非 Windows 平台,後者可以不用,但是需要自己寫 Makefile)。不過,要建置這個驅動程式模組,另外還需要先準備好 OpenNI 2 的原始碼(GitHub),以及 OpenCV 2 的函式庫。

檔案都準備好後,請先在 OpenNI 2 原始碼的「OpenNI2\Source\Drivers\」目錄下,建立一個資料夾(例如「OpenNI2\Source\Drivers\WebCam4OpenNI2」),然後把「OpenCVCamera.cpp」和「OpenCVCamera.vcxproj」這兩個檔案,放到這裡。

接下來則是開啟 OpenNI 2 的方案檔(\OpenNI.sln),並把「OpenCVCamera.vcxproj」這個專案,加到方案內,理論上就可以了(其他的驅動程式模組在「Devices」裡,這邊建議放在一起)。當然,這邊也還需要針對這個專案、以及系統上的 OpenCV2 所在路徑,做進一步的設定才行。

另外,Heresy 在建立 DLL 的 binary 的時候,為了使用上的方便,是有針對專案再做調整,改成使用 static link library 的版本,所以建立出來的 DLL 檔會把 OpenCV 必要的程式都放到憶起,所以檔案比較大,但是不需要 OpenCV 的 DLL 檔。

而如果是以 GitHub 上的版本建置的話,由於會去使用 Dynamic link library,所以建置出來的 DLL 檔會明顯比較小、而執行時也會需要 OpenCV2 的 Core、HighGUI、ImgProc 這幾個模組的 DLL 檔。


其他

目前 WebCam4OpenNI2 這個驅動程式模組,基本上大概就只有讀資料、還有設定解析度的功能,其他什麼設定都不支援;不過基本上,應該算可以用了?

之後有機會(?),應該會再做一些調整、修改。不過現階段,應該可以當作一個自行開發 OpenNI 2 驅動模式模組的範例吧?


OpenNI / Kinect 相關文章目錄

廣告

對「在 OpenNI2 環境使用 Webcam 來讀取彩色影像:WebCam4OpenNI2」的想法

  1. […] 由於 Heresy 前一陣子在研究 OpenNI 2 的驅動程式模組(參考)、也寫了一個 WebCam4OpenNI2;後來想想,反正都大概知道該怎麼做了,那與其等別人寫,倒不如自己試著改看看吧~所以,就把這些功能都補上了。這部分的修改,目前已經在 OpenNI 那邊建立 pull request(#22)了,但是目前還沒被整進去;不過如果想看怎麼改的話,應該是可以直接在 GitHub 上看到。 […]

  2. 請問,我將平台工具組改成v100 我使用vs2010,opencv2.4.5的環境都設定好了,也可以成功編譯,那為什麼產生的Driver Module會不能使用呢?

    • 你需要把有用到的 OpenCV DLL 檔(core、highgui、imgproc),複製到建置出來的 DLL 的所在目錄才行。不然就是得用 Static Link 的模式。

  3. 請問哪可找到建立模組相關教學或資料?記得beta 2剛出時有這些,但現在都找不到了

  4. 請問讀取彩色影像有什麼特別設定嗎?
    我嘗試用以下的code去讀取,結果在第四行的時候就停住了
    VideoStream mColorStream;
    mColorStream.create( mDevice, SENSOR_COLOR );
    VideoFrameRef mColorFrame;
    mColorStream.readFrame( &mColorFrame );

    • 理論上使用方法和標準 OpenNI 相同,不過建議在建立後最後檢查他是否有成功,而不是直接去使用。
      另外,Video Stream 在使用前要先呼叫 start()

      • 感謝Heresy…的確是因為忘記呼叫start()
        是否可以再請教一個問題 如果我想要再加上DepthStream 有沒有需要注意的地方?

        • 不太了解你的問題是什麼?這篇文章的主題是透過一般 webcam 來取得 OpenNI 格式的彩色影像;而一般 webcam 不會有深度畫面,所以也無法建立深度影像的 VideoStream。
          而如果你是使用 Kinect 或 Xtion 的話,就直接按照 OpenNI 的方法來做就可以了。

  5. 程式更新,現在可以支援模式檢查了。
    理論上現在只會列出有支援的模式(要搭配 OpenCVCamera.ini 做設定)。

發表迴響

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

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.