说明
这是对InfiniTAM v3项目源码工程在Windows上构建的一个简单记录。这里介绍的构建过程并不完备,InfiniTAM本身提供的依赖项这里也只是选用了其中的一二个,遇到的构建和编译问题也相对单一,参考价值仅限于工程构建初学者以及对InfiniTAM不熟悉的开发人员。
工程下载
InfiniTAM v3的相关介绍可以从官网(http://www.robots.ox.ac.uk/~victor/infinitam/download.html)获取,上面提供了工程代码的下载(https://github.com/victorprad/InfiniTAM)以及对应的技术文档(https://arxiv.org/abs/1708.00783)。
InfiniTAM的代码仓库里有多个分支,包括master, v1, v2, v3, v3.5等。本文使用的是master分支上于2018.9.10提交的代码版本(该版本是在v3分支代码的基础上添加了对realsense2.0 sdk的支持),如果单纯的使用v3分支的代码,则不支持realsense2.0。
额外的依赖库(External-deps)
InfiniTAM源码本身不包含任何依赖,需要自己配置额外的依赖库,主要的依赖库分为两类:必要的(required)和可选的(optional),详细见InfiniTAM的仓库描述。其中,必要的依赖库是:OpenGL / GLUT;可选的依赖库包括:CUDA,OpenNI,libpng, FFMPEG, librealsense, librealsenese2, libuvc。以上依赖库根据仓库描述里的推荐下载对应版本。另外,需要使用CMake作为编译工具来对工程进行构建。如果想要工程的API文档,可以通过doxygen来从源码直接生成,InfiniTAM并不提供官方的API文档,只提供了部分技术文档,可在官网上查找。
注意:因为目前的CUDA只提供64位执行,因此,执行CUDA的工程必须是64位的,这也意味着,相应的所有依赖库都必须是64位的。
OpenGL / GLUT
对InfiniTAM本身的框架来说,OpenGL以及相关的扩展工具(glut、glfw等)并不是必须的。使用OpenGL主要目的是用来绘制InfiniTAM的中间和结果数据(包括输入的RGB图像帧,depth图像帧以及生成的场景模型等)。InfiniTAM源码里提供了基于OpenGL/GLUT的显示框架,因此需要依赖对应的库才能执行其图形示例。
InifiniTAM的图形程序使用的是freeglut,可以直接下载编译好的依赖库(里面包括了include、lib和bin),也可以去官网下载源码,自己通过cmake构建工程然后编译和install。
CUDA
就是算法实现本身而言,CUDA不是必需的,但是通过CUDA能够提高算法执行的速度。当然,CUDA执行的前提是要有NVIDIA的显卡和对应的驱动做支撑。InfiniTAM工程本身在没有依赖CUDA的情况下也可以构建和执行,但是效率上就不会很好了。
CUDA的依赖库可以通过安装CUDA Toolkit来获取。这里需要注意的是,CUDA的执行因为依赖显卡和其驱动,因此需要根据程序所在的运行环境(机子的显卡型号和驱动版本)来下载对应版本的CUDA。如果驱动版本和CUDA的版本不对应,则工程在CMake阶段就会暴出错误。
FFMPEG
FFMPEG提供了一整套完整的视频流编解码工具,通过使用FFMPEG可以很容易地从视频流中获取数据或者将数据存储到视频中。InfiniTAM通过FFMPEG提供了将摄像头获取的图像(包括depth深度图像)录制到视频文件中的方法,同时也可以从视频文件中读取RGB图像流以及depth深度图像流来进行模型的重建。
在FFMPEG的官网下载页面获取FFMPEG库,主要需要下载Shared和Dev两种链接库。Windows版本库的下载地址:https://ffmpeg.zeranoe.com/builds/。
librealsense2
librealsense2 sdk提供了对realsense摄像头的支持。在realsense官网上的开发者界面中下载sdk并安装。目前realsense官网默认提供的是2.0的sdk,如果要使用1.0的依赖库,则需要在realsense的源码库中早期的提交里获取(根据InfiniTAM仓库的描述,使用2016.3.22的提交版本)。
工程构建
这里演示的是在Windows10系统上构建Visual Studio 2017 Win64的工程,包括的依赖项有:OpenGL/GLUT、CUDA、FFMPEG、librealsense2。
1. 工程源码下载
在InfiniTAM仓库下载源码,clone或者download都可以。使用默认的分支master(当前最新提交时间是2018.9.10)。下载后的工程源码目录如下图所示:
其中,FernRelocLib、InputSource、ITMLib、MiniSlamGraphLib、ORUtils为源码主体。
2. 配置依赖库
(1)freeglut:从这里下载编译好库(freeglut-MSVC-2.8.1-1),解压,将里面的freeglut文件夹解压到InfiniTAM的源码目录中。
(2)CUDA(可选):从官网上下载CUDA toolkit,选择Window10 x86_64 10 exe(local),然后获取对应的安装程序(当前默认v10.1版本)。下载后根据提示安装即可。
(3)librealsense2(可选):同样从官网上下载安装程序,下载后安装sdk即可。
(4)ffmpeg(可选):在FFMPEG的windows版下载页面中下载,选择版本4.1.1(当前最新),Windows64-bit,然后分别选择shared和dev下载对应压缩包(shared中包含动态链接库,dev中包含include和lib)。在InfiniTAM的源码目录下新建一个ffmpeg文件夹,将dev中的include和lib两个文件夹解压到ffmpeg里,然后将shared里的ffmpeg-2019-*****-win64-shared文件夹解压到ffmpeg中,重命名为shared(里面包含一个bin文件夹)。
以上的四个依赖库,只有freeglut是必要的,剩下的三个如果不是都选择或者都不选择,则会大大简化接下来的工程构建过程。
3. CMake构建工程
打开CMake GUI程序(如cmake 3.13.0),选择源代码路径为InfiniTAM的源码目录,在源码目录下新建一个build文件夹,将它作为编译路径,如下图:
点击configure,选择生成器:Visual Studio 15 2017 Win64,然后Finish。
如果CUDA配置有问题,这里会显示对应的错误。常见错误是cuda的版本和当前显卡的驱动版本不匹配,这时候需要更新驱动或者下载一个匹配当前驱动的CUDA版本。
如果初步配置顺利,会出现如下图的结果:
(注意,因为已经正确安装和配置了CUDA,初次工程配置会默认把CUDA相关的信息包含进来,另外GLUT的信息也会被默认收集并配置。如果此时继续点击Configure进行确认,那么最后generate出的工程不会有问题,可以正常编译和执行,但是会不支持部分功能如接收外接摄像头的输入,视频的录制和读取等。)
下一步,勾选WiTH_FFMPEG, WITH_REALSENSE2(这里只选取这两个功能的扩展,如果想要选取其他的功能也可以,但是前提是要配置对应的依赖库),然后再次Configure。
这里会出现第一个错误,即FFMPEG配置错误,如下图:
这里要手动修改上图中红色标识的键值对中的Value值,也就是对应的文件及文件夹路径,这些信息都在第2步配置的依赖库文件夹FFMPEG中,手动选取对应路径,如下图:
修改完成后,再次点击Configure进行确认,结果如图:
这里有两个问题,一个是找不到FFMPEG的shared文件夹路径,另一个是realsense2路径配置错误。
同样地手动修改这几个错误的值。首先,FFMPEG的shared文件夹在前面配置好的ffmpeg文件夹下,可以直接选取。然后,realsense2的配置路径实际上就是第2步中安装realsense sdk的目录,找到这个目标并选取对应文件夹即可。修改结果如下:
然后,同样地Configure确认,结果:
第三次配置成功,没有再报错。这里就可以点击Generate进行工程的生成了。
显示Generating done,表示工程生成成功。
4. 工程编译
工程生成成功后,会在build文件下生成一个InfiniTAM.sln的解决方案。使用Visual Studio 2017打开这个sln,结果如图:
可以在Debug和Release下分别生成解决方案来进行InfiniTAM的编译。
在这个解决方案中,InfiniTAM和InfiniTAM_cli是两个示例程序,其中,InfiniTAM是一个图形程序,有显示界面并可以操作;InfiniTAM_cli是一个控制台程序,提供InfiniTAM的单线程调用示例。这两个程序的执行依赖于外部数据的输入。
如果工程在构建时已经包含了对realsense或realsense2的支持,那么在机器上连接一个realsense的摄像头,就可以正常运行上面两个程序,并看到运行的结果。
如果在工程构建时没有包含任何额外的依赖库,那么可以从InfiniTAM官网上下载一个示例的图像帧序列压缩包(包含ppm和pgm),然后根据InfiniTAM程序中的源代码说明应用这些数据执行程序,执行结果如下图:
5. 部分问题
当前网上所能下载的MMPEG版本实际都高于InfiniTAM v3中应用的版本,因此有一些地方需要做修改,否则会在工程编译时发生错误。
第一个问题是,在目前的各MMPEG版本中,libavfilter/avfiltergraph.h这个头文件已经被移除,但是在InfiniTAM v3中依然引用了这个头文件,具体见InputSource/FFMPEGWriter.cpp和InputSource/FFMPEGReader.cpp。解决这个问题,只需要把对avfiltergraph.h的引用改为引用avfilter.h,因为原avfiltergraph.h中的定义已经包含在avfilter.h中了。
第二个问题是由InfiniTAM源码目录下的cmake文件夹里的LinkFFmpeg.cmake引起的。在LinkFFmpeg.cmake中已经默认定义了在工程编译时要拷贝的ffmpeg的dll文件,如下图:
而实际下载的ffmpeg的dll文件版本比默认定义的要高,如下图:
这个不一致会引起Visual Studio在工程编译时报“setlocal”错误。修改的方法就是修改LinKFFmpeg.cmake中默认拷贝的dll的文件名与实际的相同,然后重新Generate工程。