1、配置环境
第1步,资源下载:
bundlefusion源码:https://github.com/niessner/BundleFusion)
mLib库:https://github.com/niessner/mLib
mLibExternal库:https://www.dropbox.com/s/fve3uen5mzonidx/mLibExternal.zip?dl=0
或参考博主给的百度网盘链接:百度网盘 请输入提取码 ;提取码:0x4t。
数据集:http://graphics.stanford.edu/projects/bundlefusion/
DirectX SDK 地址:
http://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe。
第2步,安装DirectX SDK,#若运行安装出现错误:“ErrorCode:s1023”,尝试用
https://www.dazhuanlan.com/2019/12/13/5df30b9d0f239/ 中的解决方法1:在控制面板中卸载以下这两项即可解决,
第3步,分别解压mLib、mLibExternal,将mLib放到BundleFusion\external目录下,将mLibExternal放置与BundleFusion同级目录下。
第3步,修改BundleFusion-master\FriedLiver\FriedLiver.vcxproj 中cuda版本(默认cuda已经安装):
# 第35行
<Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 7.0.props" />
# 将7.0,修改为
<Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 11.4.props" />
# 第375行
<Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 7.0.targets" />
# 将7.0,修改为
<Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 11.4.targets" />
第3步,下载Eigen3.2.8和boost_1_81_0
分别替代在BundleFusion\mLibExternal\include目录下的Eigen和boost文件夹
第4步,添加包含目录 D:\Automation\VS2017\boost_DIR\boost_1_81_0(必须是该版本的boost)
第5步,生成->生成解决方法,若出现Eigen已被弃用错误。双击错误指向
E: BundleFusion\mLibExternal\include\Eigen\src\Core\SolveTriangular.h,将该头文件中的以下两行代码进行注释即可:
// if (copy)
// other = otherCopy;
第6步,打开文件GlobalAppState.h ,注释 // #define STRUCTURE_SENSOR,如下,
第7步,打开文件zParametersDefault.txt中的s_sensorIdx 设为8
第8步,打开文件zParametersDefault.txt 改数据集地址:s_binaryDumpSensorFile = "../data/apt0.sens"(最好为绝对路径);
第9步,执行FriedLiver.exe
RTX显卡可能存在Fried Liver窗口无响应、卡死的情况,如下图所示
错误原因:在RTX显卡上运行BundleFusion会导致GPU挂起,原因是线程同步错误。解决办法:通过将有条件的__syncthreads()调用替换为无条件调用,修复__global__ void ComputeOrientation_Kernel(…)中的同步错误。线程同步需要所有线程到达调用,否则GPU挂起并等待剩余的线程,这当然不会因为if条件而发生。解决办法如下:
(1)修改FriedLiver\Source\SiftGPU\ProgramCU.cu文件
if (tidx < 36) {
volatile float* source = vote;
volatile float* target = vote_tmp;
#pragma unroll
for (int i = 0; i < 6; i++) {
const unsigned int m = (tidx + 36 - 1) % 36;
const unsigned int c = (tidx);
const unsigned int p = (tidx + 1) % 36;
target[tidx] = (source[m] + source[c] + source[p])*one_third;
__syncthreads();
volatile float *tmp = source;
source = target;
target = tmp;
}
替换为
if (tidx < 36) {
volatile float* source = vote;
volatile float* target = vote_tmp;
#pragma unroll
for (int i = 0; i < 6; i++) {
const unsigned int m = (tidx + 36 - 1) % 36;
const unsigned int c = (tidx);
const unsigned int p = (tidx + 1) % 36;
target[tidx] = (source[m] + source[c] + source[p])*one_third;
__threadfence();
volatile float *tmp = source;
source = target;
target = tmp;
}
(2)或可以直接下载修改好的文件,替换SiftGPU文件夹。链接:
https://pan.baidu.com/s/1xPNhaazwkFoYub-Uxm5RuA ;提取码:tohk
(3)重新编译,双击FriedLiver.exe,即可运行。
运行过程中,按下tab键时,如上图所示,按照提示与软件进行交互,按下ctrl+2显示带颜色。深度,按下ctrl+3显示彩色视频流,帧率在左上角显示
2.制作数据集
第1步,数据集命名修改:修改数据集命名格式(与bundlefusion标准数据集一致)。如彩色图的命名格式是frame-000000.color.png,深度图的命名规则是frame-000000.depth.png(切记命名一定要从frame-000000.xx开始)。
第2步,源码修改:工程中BundleFusion\FriedLiver\Source\FriedLiver.cpp中原始的main函数注释掉,然后换成下面的main函数:
int main(int argc, char** argv)
{
ml::SensorData sd;
sd.loadFromImages("E:/WorkSpace/Projects/BundleFusion/Dataset/dataset_tum/rgbd_dataset_room/bfdata", "frame-", "png"); // "png"彩色图格式
sd.saveToFile("E:/WorkSpace/Projects/BundleFusion/Dataset/dataset_tum/rgbd_dataset_room/apt_tum.sens");
return 0;
}
第3步,编译运行
(更多问题欢迎私信交流)