VS2013 + 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里的提示,运行了他的例子,也就是不需要摄像头的方法,利用已有的帧数据,生成模型。 

首先从 http://www.robots.ox.ac.uk/~victor/infinitam/files/teddy_20141003.zip 下载 Teddy 模型文件,包括每一帧的彩色图和深度图,以及一个calib.txt文件,表示相机参数,我的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的时候有问题。 

猜你喜欢

转载自blog.csdn.net/Bob__yuan/article/details/83584795