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内不要有物体

有问题欢迎评论!

猜你喜欢

转载自blog.csdn.net/Man_1man/article/details/126621624
今日推荐