InfiniTAM v3 工程构建和编译记录(Windows)

说明

这是对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;可选的依赖库包括:CUDAOpenNIlibpng, 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)。下载后的工程源码目录如下图所示:

InfiniTAM源码目录

其中,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文件夹,将它作为编译路径,如下图:

CMake路径选择
实际目录情况

点击configure,选择生成器:Visual Studio 15 2017 Win64,然后Finish。

如果CUDA配置有问题,这里会显示对应的错误。常见错误是cuda的版本和当前显卡的驱动版本不匹配,这时候需要更新驱动或者下载一个匹配当前驱动的CUDA版本。

如果初步配置顺利,会出现如下图的结果:

初次配置结果

(注意,因为已经正确安装和配置了CUDA,初次工程配置会默认把CUDA相关的信息包含进来,另外GLUT的信息也会被默认收集并配置。如果此时继续点击Configure进行确认,那么最后generate出的工程不会有问题,可以正常编译和执行,但是会不支持部分功能如接收外接摄像头的输入,视频的录制和读取等。)

下一步,勾选WiTH_FFMPEG, WITH_REALSENSE2(这里只选取这两个功能的扩展,如果想要选取其他的功能也可以,但是前提是要配置对应的依赖库),然后再次Configure。

这里会出现第一个错误,即FFMPEG配置错误,如下图:

FFMPEG配置错误

这里要手动修改上图中红色标识的键值对中的Value值,也就是对应的文件及文件夹路径,这些信息都在第2步配置的依赖库文件夹FFMPEG中,手动选取对应路径,如下图:

手动配置FFMPEG

修改完成后,再次点击Configure进行确认,结果如图:

二次配置后结果

这里有两个问题,一个是找不到FFMPEG的shared文件夹路径,另一个是realsense2路径配置错误。

同样地手动修改这几个错误的值。首先,FFMPEG的shared文件夹在前面配置好的ffmpeg文件夹下,可以直接选取。然后,realsense2的配置路径实际上就是第2步中安装realsense sdk的目录,找到这个目标并选取对应文件夹即可。修改结果如下:

二次修改结果

然后,同样地Configure确认,结果:

第三次配置成功

第三次配置成功,没有再报错。这里就可以点击Generate进行工程的生成了。

显示Generating done,表示工程生成成功。

4. 工程编译

工程生成成功后,会在build文件下生成一个InfiniTAM.sln的解决方案。使用Visual Studio 2017打开这个sln,结果如图:

生成的VS工程

可以在Debug和Release下分别生成解决方案来进行InfiniTAM的编译。

在这个解决方案中,InfiniTAM和InfiniTAM_cli是两个示例程序,其中,InfiniTAM是一个图形程序,有显示界面并可以操作;InfiniTAM_cli是一个控制台程序,提供InfiniTAM的单线程调用示例。这两个程序的执行依赖于外部数据的输入。

如果工程在构建时已经包含了对realsense或realsense2的支持,那么在机器上连接一个realsense的摄像头,就可以正常运行上面两个程序,并看到运行的结果。

如果在工程构建时没有包含任何额外的依赖库,那么可以从InfiniTAM官网上下载一个示例的图像帧序列压缩包(包含ppm和pgm),然后根据InfiniTAM程序中的源代码说明应用这些数据执行程序,执行结果如下图:

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文件名

而实际下载的ffmpeg的dll文件版本比默认定义的要高,如下图:

实际要拷贝的ffmpeg dll文件

这个不一致会引起Visual Studio在工程编译时报“setlocal”错误。修改的方法就是修改LinKFFmpeg.cmake中默认拷贝的dll的文件名与实际的相同,然后重新Generate工程。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容