vs2017+BundleFusion运行离线数据集

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步,编译运行

(更多问题欢迎私信交流)

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值