一 摘要
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.txt
和zParametersDefault.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.txt
和zParametersDefault.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内不要有物体
有问题欢迎评论!