BundleFusion复现手册——Win10+VS2013+Cuda8.0+KinectV2实时重建

一 摘要

BundleFusion由斯坦福大学、德国 MPII 以及微软研究院共同开发,用于实时构建高精度三维模型,是目前效果最好的开源算法框架。
论文:《BundleFusion: Real-time Globally Consistent 3D Reconstruction using Online Surface Re-integration》。
论文地址:https://arxiv.org/pdf/1604.01093.pdf
视频地址:https://www.youtube.com/watch?v=keIirXrRb1k
GitHub 地址:https://github.com/niessner/BundleFusion
本文主要介绍了如何使用官方离线数据以及kinectv2深度相机在开源算法框架 BundleFusion 中实现实时三维建图。

二 操作环境

在我的GTX1060台式机和GTX1065Ti笔记本均运行成功

环境项版本/型号
操作系统Win_x64
开发工具集Visual Studio 2013
计算架构CUDA8.0
深度相机Kinect V2
显卡GTX1060/GTX1065Ti

三 工程环境配置

3.1 装VS2013和CUDA8.0

一定要先安装VS再装CUDA8.0
CUDA8.0地址:https://developer.nvidia.com/cuda-80-ga2-download-archive
其他版本地址:https://developer.nvidia.com/Cuda-Toolkit-archive

3.2 DirectX SDK 安装

下载地址 http://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe

3.3 Kinect SDK 2.0

Kinect SDK 2.0 下载地址

下载并安装,连接上Kinect相机,并可以成功输出图像。
如果只想跑离线数据可以跳过这一步。

四 VS2013代码生成(以离线数据为例)

**此部分为以离线数据集为例,如若使用Kinect v2或其它深度相机直接略过此章直接跳到第五部分**

BundleFusion GitHub 地址:https://github.com/niessner/BundleFusion
从 GitHub 上下载,并解压,得到工程 BundleFusioin-master

4.1 依赖配置

mLib下载地址:https://github.com/niessner/mLib
解压后,替换掉目录 BundleFusioin-master/external/mLib

mLib external 下载地址
https://www.dropbox.com/s/fve3uen5mzonidx/mLibExternal.zip?dl=0
解压后,放到 BundleFusioin-master同级目录
网址访问不了的话可以从这个网盘下
https://pan.baidu.com/s/1CJysQCHl4t7RPfvqliwfew 提取码:0x4t

最终目录结构如下

BundleFusion-master/
	external/
		mLib/
			data/
			src/
			[...]
	FriedLiver/
		[...]
		FriedLiver.sln
		[...]
mLibExternal/
	include/
	libsWindows/
	[...]

4.2 CUDA设置

用 VS2013 打开 BundleFusion-master/FriedLiver/FriedLiver.sln 工程,如果 cuda 版本不是原代码设置的 cuda7.0,就会出现如下错误:
在这里插入图片描述

修改 BundleFusion-master/FriedLiver/FriedLiver.vcxproj 文件,用vscode、notepad++、记事本等打开该文件,并修改如下两行:

#第35行 7.0改为8.0

在这里插入图片描述

#第375行 7.0改为8.0

在这里插入图片描述

4.3 显卡能力设置

右键项目,打开属性页,设置显卡能力等级,选择适合你显卡的 compute 能力,显卡计算能力在这里查询

在这里插入图片描述

4.4 相机类型设置(以office3.sens离线数据为例)

输入数据可以为 Kinect v1,Kinect v2,PrimeSenseSensor,IntelSensor,RealSense,StructureSensor 以及 SensorDataReader(离线数据)
具体可以查看FriedLiver.cpp中 7-103 行的内容

	离线数据下载地址:
	http://graphics.stanford.edu/projects/bundlefusion/

	因为使用的是离线数据,将GlobalAppState.h中深度相机全部注释掉

在这里插入图片描述

4.5 生成 FriedLiver.exe

修改为 Release 版本,然后选择 生成->生成解决方法
编译通过后,如下图:

在这里插入图片描述

	编译可能失败,如果遇到错误可以看最后一章

BundleFusion-master/riedLiver/64/Release中生成可执行文件FriedLiver.exe

4.6 配置文件修改

BundleFusion-master/FriedLiver目录下的zParametersBundlingDefault.txtzParametersDefault.txt拷贝到BundleFusion-master/FriedLiver/X64/Release/

打开 zParametersDefault.txt 配置文件,选择输入类型,这里使用离线数据,修改第 2 行,设置s_sensorIdx = 8 。如果用深度相机(如:Kinect v2实时运行,修改为对应的序列号。

在这里插入图片描述

修改第 49 行,设置s_hashNumSDFBlocks = 100000

在这里插入图片描述
数据集下载 http://graphics.stanford.edu/projects/bundlefusion/
我这里用的是官方实例同款office3.sens
将下载的office3.sens放置到BundleFusion-master/FriedLiver/x64/data

4.7 运行结果

点击FriedLive.exe运行

在这里插入图片描述
运行结束后,BundleFusion-master/FriedLiver/X64/data/office3.sens同目录下生成office3.ply
meshlab打开查看重建效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五 VS2013代码生成(KinectV2实时重建)

**此部分为RGB-D相机实时重建部分,如若使用离线数据请看第四章**

BundleFusion GitHub 地址:https://github.com/niessner/BundleFusion
从 GitHub 上下载,并解压,得到工程 BundleFusioin-master

5.1 依赖配置

mLib下载地址:https://github.com/niessner/mLib
解压后,替换掉目录 BundleFusioin-master/external/mLib

mLib external 下载地址
https://www.dropbox.com/s/fve3uen5mzonidx/mLibExternal.zip?dl=0
解压后,放到 BundleFusioin-master同级目录
网址访问不了的话可以从这个网盘下
https://pan.baidu.com/s/1CJysQCHl4t7RPfvqliwfew 提取码:0x4t

最终目录结构如下

BundleFusion-master/
	external/
		mLib/
			data/
			src/
			[...]
	FriedLiver/
		[...]
		FriedLiver.sln
		[...]
mLibExternal/
	include/
	libsWindows/
	[...]

5.2 CUDA设置

用 VS2013 打开 BundleFusion-master/FriedLiver/FriedLiver.sln 工程,如果 cuda 版本不是原代码设置的 cuda7.0,就会出现如下错误:
在这里插入图片描述

修改 BundleFusion-master/FriedLiver/FriedLiver.vcxproj 文件,用vscode、notepad++、记事本等打开该文件,并修改如下两行:

#第35行 7.0改为8.0

在这里插入图片描述

#第375行 7.0改为8.0

在这里插入图片描述

5.3 显卡能力设置

右键项目,打开属性页,设置显卡能力等级,选择适合你显卡的 compute 能力,显卡计算能力在这里查询

在这里插入图片描述

5.4 相机类型设置(KinectV2实时重建)

输入数据可以为 Kinect v1,Kinect v2,PrimeSenseSensor,IntelSensor,RealSense,StructureSensor 以及 SensorDataReader(离线数据)
具体可以查看FriedLiver.cpp中 7-103 行的内容

打开GlobalAppState.h,KinectV2是第二个,用哪个将哪个取消注释,并安装对应 SDK。

在这里插入图片描述

4.5 生成 FriedLiver.exe

修改为 Release 版本,然后选择 生成->生成解决方法
编译通过后,如下图:

在这里插入图片描述

	编译可能失败,如果遇到错误可以看最后一章

BundleFusion-master/riedLiver/64/Release中生成可执行文件FriedLiver.exe

5.6 配置文件修改

BundleFusion-master/FriedLiver目录下的zParametersBundlingDefault.txtzParametersDefault.txt拷贝到BundleFusion-master/FriedLiver/X64/Release/

打开 zParametersDefault.txt 配置文件,选择输入类型,这里是Kinectv2,修改第 2 行,设置s_sensorIdx = 2

修改第 49 行,设置s_hashNumSDFBlocks = 100000

在这里插入图片描述
在Release文件夹下创建scans文件夹,用来存放扫描后的mesh

在这里插入图片描述

然后直接点击FriedLive.exe 运行,点击Tab键,显示窗口会出现帮助等操作,按2 加载彩色深度图,9 直接把扫描的结果保存到scans 文件中

5.7 运行结果

在这里插入图片描述

六 遇到的错误及解决办法

找不到boost的array_wrapper.hpp

编译时遇到了一个问题,找不到boost的array_wrapper.hpp,
解决办法:用array.hpp替换array_wrapper.hpp

错误error C2065: “SensorDataReader”: 未声明的标识符

在这里插入图片描述

解决办法:出现这个问题是因为没有修改对应的GlobalAppState.h和zParametersDefault.txt中的输入数据类型,或者是两个文件中的输入数据类型不一致,前面有讲过了怎么改,改成你所用的深度相机或者离线数据的接口就可以了

FriedLive.exe实时重建显示界面卡死

DepthSensiong.cpp作如下修改
将987行:

bGotDepth = g_CudaImageManager->process()

替换为

bool bGotDepth;
while (!(bGotDepth = g_CudaImageManager->process()));

FriedLive.exe实时重建显示界面闪退

启动程序时保证相机前方不能有遮挡,最好0.5m内不要有物体

有问题欢迎评论!

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
实时全局一致的3D重建,使用动态表面重新整合技术实时,高品质,大尺寸场景的3D扫描是混合现实和机器人应用的关键。然而,可扩展性带来了姿态估计漂移的挑战,在累积模型中引入了显着的错误。方法通常需要几个小时的离线处理来全局纠正模型错误。最近的在线方法证明了令人信服的结果,但遭受以下缺点:(1)需要几分钟的时间才能执行在线修正,影响了真正的实时使用; (2)脆弱的帧到帧(或帧到模型)姿态估计导致许多跟踪失败;或(3)仅支持非结构化的基于点的表示,这限制了扫描质量和适用性。我们通过一个新颖的,实时的端对端重建框架来系统地解决这些问题。其核心是强大的姿态估计策略,通过考虑具有高效分层方法的RGB-D输入的完整历史,针对全局摄像机姿态优化每帧。我们消除了对时间跟踪的严重依赖,并且不断地将其定位到全局优化的帧。我们提出了一个可并行化的优化框架,它采用基于稀疏特征和密集几何和光度匹配的对应关系。我们的方法估计全局最优化(即,束调整的姿势)实时,支持从总跟踪故障(即重新定位)恢复的鲁棒跟踪,并实时重新估计3D模型以确保全局一致性;都在一个框架内。我们优于最先进的在线系统,质量与离线方法相同,但速度和扫描速度前所未有。我们的框架导致尽可能简单的扫描,使用方便和高质量的结果。
BundleFusion算法虽然在实时重建和场景重建方面有一定的优势,但也存在一些不足之处: 1. 对大规模场景的处理能力有限:BundleFusion算法在处理大规模场景时可能会面临内存和计算资源限制的挑战。由于需要存储和处理大量的点云数据,算法的实时性能可能会受到限制。 2. 对运动快速或动态场景的鲁棒性较差:BundleFusion算法在处理运动快速或动态场景时可能会出现模糊或伪影等问题,导致重建结果的不准确性。算法对于相机姿态变化和场景动态性的鲁棒性有待改进。 3. 对纹理缺乏鲁棒性:由于BundleFusion算法主要依赖于特征点的提取和匹配,对于纹理缺乏或低纹理区域的处理可能会存在困难。这可能导致在低纹理区域的重建结果较差。 4. 对平面结构和非平面结构的处理不平衡:BundleFusion算法在处理平面结构和非平面结构时可能存在处理不平衡的问题。对于非平面结构,算法可能需要更复杂的建模和优化策略来捕捉其几何形状和细节。 5. 受限于输入传感器:BundleFusion算法对输入传感器的要求较高,需要精确的相机姿态和深度图像信息。这可能限制了算法在一些设备或传感器上的适用性。 综上所述,BundleFusion算法在实时重建和场景重建方面具有一定的局限性。然而,随着技术的不断发展和改进,这些问题有望得到进一步解决,并提高算法的稳定性和鲁棒性。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值