当前位置: 代码迷 >> 综合 >> Intel RealSense D435i + BundleFusion 实现实时三维建图
  详细解决方案

Intel RealSense D435i + BundleFusion 实现实时三维建图

热度:51   发布时间:2024-02-09 18:07:09.0

内容概览

  • 摘要
  • 操作环境
  • RealSense D435i 介绍
  • BundleFusion工程环境配置
    • 安装 RealSense SDK
    • RealSense SDK 本地环境配置
    • BundleFusion 工程属性表
    • 相机类型设置
      • 修改 GlobalAppState.h 文件
      • 修改 FriedLiver.h 文件
    • 添加 RealSense 相关实现类
  • 生成解决方案
    • error C3646
      • 出错原因
      • 解决方案
    • error LNK2001
      • 出错原因
      • 解决方案
  • 配置文件修改
    • 修改 zParametersDefault.txt
    • 修改 zParametersBundlingDefault.txt
  • 模型生成
  • 结语

摘要

BundleFusion由斯坦福大学、德国 MPII 以及微软研究院共同开发,用于实时构建高精度三维模型,是目前效果最好的开源算法框架。论文:《BundleFusion: Real-time Globally Consistent 3D Reconstruction using Online Surface Re-integration》。本文主要介绍了如何使用 Intel RealSense D435i 系列深度相机在开源算法框架 BundleFusion 中实现实时三维建图。

操作环境

环境项 版本/型号
操作系统 Win10_x64
开发工具集 Visual Studio 2013
计算架构 CUDA 8.0
深度相机 Intel RealSense D435i
显卡 NVIDIA GeForce 940MX

其中,CUDA 8.0 与 DirectX SDK 的安装配置、BundleFusion 工程代码生成(包括 mLib 与 mLib external 配置、CUDA 设置以及显卡算力设置等)可参照博文《BundleFusion在win10+vs2013+cuda8.0上的实现》。

请务必将 FriedLiver.vcproj 文件中的 cuda 版本修改为本地安装版本,否则 VS2013 将无法打开 BundleFusion 工程!!!

BundleFusion工程代码的最终目录结构如下所示:

 BundleFusion-master/external/mLib/   # 下载后进行替换data/src/[...]FriedLiver/[...]FriedLiver.sln[...]mLibExternal/   # 下载解压后放至BundleFusion-master的同级目录下includelibsWindows[...]

RealSense D435i 介绍

RealSense D435 提供全局快门感应器和更大的镜头,以获得比 D415 更好的低光照性能。D435 还具有更强大的 RealSense 模块 D430,捕捉最远距离可以达到 10 米并且可在户外阳光下使用,支持输出 1280x720 分辨率的深度画面,在视频传输方面可以达到 90fps。D435i 在 D435 的基础上增加了一个 IMU 单元 BMI055,可以实时同步 IMU 数据和深度。

Intel RealSense D435i 系列深度相机

BundleFusion工程环境配置

安装 RealSense SDK

不同系列的深度相机所对应的SDK版本也各不相同,具体如下表所示:

相机系列 SDK版本
F200 2016R2、2016R3
R200 2016R2、2016R3
SR300 2016R2、2016R3、2.0
D415 / D435 2.0

本文使用的是RealSense D435i 系列的深度相机,故需要下载 RealSense SDK 2.0。双击安装包并按照默认安装路径进行安装,成功安装后,电脑桌面将出现三个图标。

在这里插入图片描述
使用USB线连接好深度相机和电脑后,查看设备管理器,在“图像设备”中将出现如下两项:

设备管理器
双击打开 “ Intel RealSense Viewer ”,自动检测到 D435i 的接入,并在右侧窗口成功显示彩色图及深度图信息。此时说明 RealSense SDK 2.0 驱动程序成功安装,RealSense D435i 能够正常工作。

Intel RealSense Viewer

RealSense SDK 本地环境配置

在环境变量中新建一个名为 RealSenseSDK 的系统变量,如下图所示:

系统变量

BundleFusion 工程属性表

BundleFusion 工程属性表的配置参照博文《BundleFusion 中 RealSense 深度相机数据流流程》。首先,将 RealSense SDK 2.0 安装路径下的 realsense2.dll 和 realsense2.lib 拷贝至 “ BundleFusion-master/FriedLiver" 目录下,如下图所示:

在这里插入图片描述
其次,使用 VS2013 打开 BundleFusion工程,打开“属性管理器”, 右键工程,选择“添加现有属性表”,从 RealSense SDK 2.0 的安装路径下选择已有属性表,如下图所示:

在这里插入图片描述
在这里插入图片描述
最后,切换回“解决方案资源管理器”,右键工程,选择属性,添加 RealSense SDK 2.0 的引用目录和库目录并设置平台工具集,如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相机类型设置

BundleFusion 工程所支持的输入数据包括 Kinect V1、Kinect V2、PrimeSenseSensor、IntelSensor、RealSense、StructureSensor以及SensorDataReader(离线数据集)。

修改 GlobalAppState.h 文件

本文使用的是 RealSense 深度相机,所以将 GlobalAppState.h 中的 REAL_SENSE 取消注释,而将其他深度相机全部注释掉,如图所示:

在这里插入图片描述

修改 FriedLiver.h 文件

在 FriedLiver.h 文件中添加支持库 realsense2.lib 如下图所示:

在这里插入图片描述

添加 RealSense 相关实现类

由于 BundleFusion 工程中没有对于 RealSenseSensor 类的实部分,为使 BundleFusion 工程能够使用 D435i 相机,需要编写其实现类(包括头文件和实现文件)。适用于 D415/D435/D435i 深度相机 的 RealSenseSensor 实现类可从 RealSenseSensor for D415/D435/D435i in BundleFusion 获取。下载解压后将头文件与实现文件拷贝至 “ BundleFusion-master/FriedLiver/Source ” 路径下,如图所示:

在这里插入图片描述

生成解决方案

error C3646

在 VS2013 中将 BundleFusion 工程设置为 Release 版本并选择“生成-生成解决方案”以进行编译。此时,解决方案生成失败,报错 error C3646: “no except”:未知重写说明符,如下图所示:

报错

出错原因

此处为编译 RealSense SDK 2.0 报错,因为 “ noexcept ” 是基于 c++14 编译器编译,而 VS2013 编译器是基于c++11。

解决方案

只需将出错文件相应位置的 “ noexcept " 修改为 ” throw() “ 即可。

error LNK2001

再次编译BundleFusion工程。此时,解决方案生成失败,报错 error LNK2001: “无法解析的外部符号”,如下图所示:

报错

出错原因

在添加 RealSense 相关实现类时,将头文件及实现文件直接拷贝到Source目录下,并没有真正将其包含在项目中,导致 “ RealSenseSensor ” 为无法解析的项目外部符号。

解决方案

点击“显示所有文件”图标,查看Source目录下 RealSenseSensor.cpp 以及 RealSenseSensor.h 文件,发现两个文件前面均有小红点,如下图所示:

在这里插入图片描述
此时选中两个文件,右键选择“包含在项目中”,如图所示:

在这里插入图片描述
再次生成解决方案,最终在 “ BundleFusion-master/FriedLiver/x64/Release ” 目录下成功生成 FriedLiver.exe 。

成功

配置文件修改

将 ” BundleFusion-master/FriedLiver " 目录下的 zParametersBundlingDefault.txt 和 zParametersDefault.txt 拷贝至 “ BundleFusion-master/FriedLiver/x64/Release ” 目录下。

修改 zParametersDefault.txt

打开 zParametersDefault.txt 配置文件,选择输入类型为 REAL_SENSE,设置 s_sensorIdx = 6

修改配置文件
设置 s_hashNumSDFBlocks = 100000

修改配置文件

修改 zParametersBundlingDefault.txt

为避免出现窗口崩溃或没有响应直接跳出,打开 zParametersBundlingDefault.txt 配置文件,设置 s_maxNumImages = 400

修改配置文件

模型生成

配置修改后,双击运行 FriedLiver.exe 即可使用 RealSense D435i 深度相机进行实时三维建图。室内实时三维重建效果如下所示:

实时三维重建
此时,按下 tab 建,即可与应用程序进行交互。在 “ BundleFusion-master/FriedLiver/x64/Release ” 目录下新建文件夹 scans , 通过快捷键 Ctrl + 9 即可导出当前模型到 " BundleFusion-master/FriedLiver/x64/Release/scans ",可用 Meshlab 查看当前的三维重建效果。

结语

以上就是使用 Intel RealSense D435i 系列深度相机在开源算法框架 BundleFusion 中进行实时三维重建的操作过程与注意事项。期待与其他深度相机的美丽邂逅,哈哈哈!

  相关解决方案