参考:
BundleFusion:VS2019 2017 ,CUDA11.5,win11,Realsense D435i+离线数据包跑通,环境搭建 - 知乎
Win10+VS2017+CUDA10.1环境下配置BundleFusion - 知乎
BundleFusion+WIN11+VS2019 + CUDA11.7环境配置-CSDN博客
我的环境:Win 11专业版,显卡Nvidia RTX 4090D(CUDA驱动572.83,最大支持CUDA12.8)。
step1. 先安装Visual Studio 2019 community
项目首页 - VisualStudio2019社区版离线下载资源:Visual Studio 2019 社区版离线下载资源本仓库提供了一个名为 `vs_Community-2019.zip` 的资源文件,该文件包含了 Visual Studio 2019 社区版的离线下载内容 - GitCode
下载,点击安装,只选择C++桌面开发模块,选中右侧在msvc-x86/64、win10SDK(和win11sdk)。
step 2. 安装CUDA 11.8
进入官网CUDA Toolkit Archive | NVIDIA Developer
选择版本号11.8,选择WIN 11 x86_64,进行local离线安装模式:下载对应.exe。
双击.exe,选择自定义安装,不选Other components 和 Driver components,下一步。
在安装界面会显示CUDA检测到的VS版本(我的是2019)。
检验:windows powershell中:nvcc -V,输出版本11.8说明安装成功。
检验2:右键点击 此电脑->属性->高级系统设置->环境变量,在系统变量中自动出现CUDA_PATH和CUDA_PATH_V11_8的路径。
step 3. 安装DirectX SDK
Download DirectX SDK from Official Microsoft Download Center
下载DXSDK_Jun10.exe,双击安装(注意可能出现之前安装的Microsoft Visual C++ 2010 x86 Redistributable和
Microsoft Visual C++ 2010 x64 Redistributable 引起的问题
):accept->not participate,等待下载和安装完成。
查看电脑的系统变量中,自动出现DXSDK_DIR。
step 4. 安装meshlab
MeshLab - Windows官方下载 | 微软应用商店 | Microsoft Store
可以直接由microsoft store安装,用来可视化bundlefusion生成的.ply文件。
由于我不用realsense或kinect实时采集数据,而是运行离线的.sense数据集(地址:BundleFusion),所有没有配置Realsense.SDK(配置详情请参考[1])。
step 5. 下载BundleFusion和相关依赖库源码
BundleFusion:
Bniessner/BundleFusion: [Siggraph 2017] BundleFusion: Real-time Globally Consistent 3D Reconstruction using Online Surface Re-integrationhttps://github.com/niessner/BundleFusionmLib:github.com
https://github.com/niessner/mLibmLib external:
百度网盘 请输入提取码https://pan.baidu.com/share/init?surl=CJysQCHl4t7RPfvqliwfew提取码:0x4t。
三个文件解压缩,注意BundleFusion-master的存放路径不包含中文、空格,不要放在桌面。
将mLib-master解压缩后的文件替换BundleFusion-master\external\mLib;
将mlibExternal解压缩后,放在BundleFusion-master同一级文件夹下。
step 6. 更改代码
用VS2019打开BundleFusion-master/BundleFusion-master/FriedLiver/FriedLiver.sln
(点击确定:重定向项目:win 10 sdk)
6.1 修改FriedLiver.vcxproj
ctrl+f,查找7.0(共两处),替换为CUDA版本号 11.8。
6.2 修改BundleFusion-master\external\mLib\include\core-base\common.h
将代码第61行#include <boost/serialization/array_wrapper.hpp>
改为#include <boost/serialization/array.hpp>
6.3 修改mLibExternal\include\Eigen\src\Core\util\Macros.h
将310行改为
#if defined(_MSC_VER) && (_MSC_VER < 1900) && (!defined(__INTEL_COMPILER))
6.4 修改\SiftGPU\ProgramCU.cu
参考Fix GPU hangs in SiftGPU by stotko · Pull Request #56 · niessner/BundleFusion
需要注释掉if{ __syncthreads()},否则带条件的同步会引起死锁问题,导致编译成功后Fried Liver运行界面会卡住不显示。
具体注释两个地方:992行,和 1104行。
6.5 修改GlobalAppState.h
因为不用realsense或kinect实时采集输入,所以将深度相机(即带Sensor的)注释掉(反之亦然),如下图。
6.6 配置CUDA算力
在VS界面右侧解决方案资源管理器中,右键项目名FriedLiver->属性,在CUDA C/C++中Device中修改compute_35,sm_35为合适的计算能力。我的显卡虽然是NVIDIA RTX 4090D,计算能力为8.9,但改为89后,会报类似于__shfl_down未定义的错误;需要下调为合适的值,我最终改成compute_52,sm_52。
6.7 找不到 xxx.dll
编译报错:找不到FreeImage.dll,将BundleFusion-master\mLibExternal\libsWindows\dll64目录下的FreeImage.dll,复制到项目目录./x64/debug下。
报错找不到vcomp110.dll,进入Download Visual C++ Redistributable for Visual Studio 2012 Update 4 from Official Microsoft Download Center
选择download x64.exe,安装即可。
step 7. 编译生成
不报错了,但是提示参数文件zParametersBundlingDefault.txt和zParametersDefault.txt设置有问题。
首先设置zParametersBundlingDefault.txt:将s_maxNumImages = 1200改为稍微小的值比如400。注意根据SensorDataReader.cpp64行,传入.sense的图像数量m_numFrames应不超过s_maxNumImages*s_submapsize。所以如果你选择的sense规模比较大,就会报错"change param file to accommodate"。
然后修改zParametersDefault.txt:将s_sensoridx = 8,即offiline processing读取已经录制好的.sense输入,而不是实时采集的相机。将s_hashNumSDFBlocks调小为100000。将s_binaryDumpSensorFile = "最好是.sense的绝对路径",设置好输入路径,最后生成的.ply也保存在该路径下。
编译运行,应该没有问题了: