1. 程式人生 > >Kinect v2.0 + infiniTAM 三維重建

Kinect v2.0 + infiniTAM 三維重建

最近在做深度相機進行三維重建的工作,想配置一下非常有名的Kinect Fusion,也就是 PCL_KinFu 這個功能,PCL的庫很好配,但是 KinFu 就異常難配了,windows下試了5次左右沒有成功,每次都是最後編譯生成出一部分的exe和dll,但是就是沒有跟 kinfu 有關的,然後在Ubuntu裡配了一次,最後pcl_kinfu_app.exez是有了,就是一直can't open depth source,應該是 kinect2.0 的問題,因為 OpenNI2 和 Kinect 2.0 並不相容,借鑑 http://www.wfuyu.com/technology/26874.html 。

    不想在PCL那麼大的庫上浪費時間了,就轉戰一個小一點的庫,叫做 infiniTAM(an open source, multi-platform framework for real-time, large-scale depth fusion and tracking, released under an Oxford University Innovation Academic License.)。也是開源的三維重建的方法之一。

    避免枯燥先放兩個結果,一個是不用深度相機,用它給的很多幀的資料跑的泰迪熊的效果,一個是我用 Kinect v2.0 跑的效果。(CSDN的部落格 gif 只能5MB以內,只能這個解析度了,我的效果就放一張圖好了,因為是實時重建的,隨便截了一張圖,效果不是很好- -,不過整體的效果確實也不是很好)。

    配置這個infiniTAM用了大概半天的時間(win 10),需要的軟體以及包如下:

一、freeglut 

先編譯freeglut,開啟CMake,設定好路徑,點選Configure,確認建立新資料夾 build,選擇 VS 12 2013,不要選擇 64 位的(我也不知道為什麼,64位的配不好,應該是很多東西預設是32位)。

 

Configure結束後,點 Generate,然後Open Project(確認是用vs2013開啟的)。 

生成 ALL_BUILD,然後生成 INSTALL,生成INSTALL的時候我報了個錯如下,解決方法就是右鍵 INSTALL,“屬性” -> “生成事件” -> “後期生成事件” -> “在生成中使用”,改為 “否”。(後邊還有這樣的 error MSB3073: 命令 setlocal 。。的問題都這麼解決

)。重新生成後,應該可以看到

 

freeglut的build/ib下應該有 freeglut.lib 檔案,include資料夾下應該是 “GL” 資料夾,裡邊有四個 .h 檔案。

二、OpenNI 2

    下載下來的 OpenNI 的32位安裝包之間安裝在預設位置就行,按照這個 http://www.wfuyu.com/technology/26874.html 教程把\OpenNI2-kinect2\Bin\x64-Debug\OpenNI2\Drivers中的 Kinect2.dll,Kinect.lib 等檔案拷貝到OpenNI2安裝目錄\OpenNI2\Tools\OpenNI2\Drivers下。這樣才能找到Kinect 2.0。在小娜裡搜尋 “NiViewer”,執行,應該有類似下邊的介面,如果沒有,顯示的是 “no devices found”,可以多試兩次,如果一直不行,說明沒有配好,驅動不了kinect 2.0。

三、InfiniTAM

    同樣方式CMake InfiniTAM,確認建立新資料夾 build,同樣用 vs 12 2013(不要用x64),會報錯,因為有很多東西需要手動配。將glut目錄手動修改到剛才編譯的地方,並將 WITH 中 “WITH_OPENNI” 選上,Configure,會出現 OpenNI的條目,

 

 這裡的一定要設定路徑到 x86路徑下,否則後便會出錯。Configure,Generate,Open Project,移除 “ZERO_CHECK” 和 “ALL_BUILD” (其實不移也行),然後設 “InfiniTAM” 為啟動項,將專案設定為 “release” 模式,生成解決方案。生成過程中有提示重新載入,選擇 “全部重新載入” 就行。最後還是會出現error MSB3073: 命令 setlocal 。。的問題,將 “InfiniTAM” 的 “屬性” -> “生成事件” -> “後期生成事件” -> “在生成中使用”,改為 “否” 即可。再生成 “InfiniTAM”,可以運行了,ctrl + F5 執行,會提示 “找不到OpenNI2.dll,。。” ,把 “C:\Program Files (x86)\OpenNI2\Redist” 目錄下的所有檔案賦值貼上到  “...../InfiniTAM-master\InfiniTAM\build\Apps\InfiniTAM\Release” 下,這裡放的就是剛才生成的exe檔案。

然後在執行, 會出現提示沒有devices,

我先是用cmd裡的提示,運行了他的例子,也就是不需要攝像頭的方法,利用已有的幀資料,生成模型。 

C:\ChromeDownloads\InfiniTAM-master\InfiniTAM\build\Apps\InfiniTAM\Release\InfiniTAM.exe C:\Users\dell\Desktop\Teddy\calib.txt C:\Users\dell\Desktop\Teddy\Frames\%04i.ppm C:\Users\dell\Desktop\Teddy\Frames\%04i.pgm

就是用我們release模式下生成的exe檔案,使用Teddy的相機引數calib.txt檔案,讀取4位長度的 .ppm 和 .pgm 檔案(檔名都是0000.ppm、0001.ppm 這樣依次往後的),效果就是文章一開始的樣子。說明其實環境已經配的差不多了。

但是,凡事就怕 “差不多”,可以看到上邊的提示就是 “compiled without Kinect 2 support”,我的直覺就是這句話一定是程式中的輸出,直接搜就搜到了,在 InputSource 專案下,Kinect2Engine.cpp裡,輸出了這句話。這是因為上邊的 #ifndef 沒有成功,但是全域性搜了 “COMPILE_WITHOUT_Kinect2” 這個巨集也沒有別的地方有,我就把這句話刪了,讓它強制執行下邊的有 kinect 的程式碼,然後把後邊相應的 #else 和 #endif 裡的程式碼都刪了。可以看到需要 Kinect.h 這個標頭檔案,以及 Kinect20.lib 這個庫。

 

    在第二項裝OpenNI的時候,應該就已經裝了kinect,用 Everything 搜一下就能找到 kinect.h 和 lib 的目錄,把兩個目錄新增到InputSource的附加包含目錄和庫目錄裡,注意要用 x86 的庫!我的是標頭檔案目錄是 “C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\inc”,庫目錄是 “C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\Lib\x86”。同時確認是在 release 模式以及 win32 下的配置。

這個庫目錄需要同樣新增到 InfiniTAM 和 InfiniTAM_cli 專案的附加庫目錄裡才能跑,標頭檔案的目錄不需要。

重新生成解決方案,再 ctrl + F5 執行,提示就變成了 Kinect 已經有了。

還是 還是 no devices found,真是醉了,這個是因為 OpenNI裡驅動力是 Kinect 1 的驅動(沒有試過 Kinect 1 是不是到這裡就已經可以了),需要換成 Kinect 2 的。在第二步的時候是裝了 Kinect 2 的驅動的,用 Everything 搜 Kinect.dll 就可以找到,注意要使用 32 位的。把下圖資料夾中的所有檔案賦值貼上到我們exe的路徑下的 OpenNI 資料夾下,可以看到他裡邊原來是有 Kinect.dll 的,如果不用其實可以刪了。

 

再執行, 如果看到下邊這個介面,就說明!終於!成功了!

如果沒有,多試幾次,有時候確實不行,關了再執行,多試幾次就好了。

 

下邊有提示,按 b 就是視訊,實時重建,n就是一幀的,但是看程式碼,儲存mesh模型出來,是按 w,但是我按 w 是會出現 “bad allocation” 的問題,就崩了,應該是 cuda gpu轉cpu的時候有問題。