win10+cuda8.0+vs2013+kinectv2+bundlefusion的安装配置

配置环境如题,显卡是TITAN X

安装流程:

1.安装vs2013

2.安装cuda8.0

3.安装DirectX SDK June 2010

4.安装Kinect SDK 2.0

5.从github里把bundlefusion下载下来https://github.com/niessner/BundleFusion

6.下载mLibExtrernal,放在与bundlefusion同级文件夹下:http://kaldir.vc.in.tum.de/mLib/mLibExternal.zip

7.下载mLib,放在BundleFusion-master/external/mLib里面:https://github.com/niessner/mLib

8.此时的文件位置是这样的:

BundleFusion-master/
  external/
    mLib/ # this is the submodule you replaced
      data/
      src/
      [...]
  FriedLiver/
    [...]
    FriedLiver.sln
    [...]
mLibExternal/ # you downloaded this from Dropbox
  include
  libsWindows
  [...]

9.用vs2013打开FriedLiver.sln,会报错找不到cuda7.0,这时只需从vs2013里面编辑FriedLiver.vcxproj,将所有的CUDA 7.0.props都变成CUDA 8.0.props即可,修改后重新加载项目。

10.然后就开始编译了

先编译离线方法

将GlobalAppState.h中这样修改:

//#define KINECT
//#define KINECT_ONE
//#define OPEN_NI
#define BINARY_DUMP_READER
//#define INTEL_SENSOR
//#define REAL_SENSE
//#define STRUCTURE_SENSOR
#define SENSOR_DATA_READER

#define RUN_MULTITHREADED

然后用Release编译(debug会报dll缺失的错),编译成功。

如果想要用debug编译,需要将mLibExternal/libsWindows/dll64里的FreeImage.dll放入C:\Windows\System32和C:\Windows\SysWOW64即可。

将zParametersDefault.txt中的s_sensorIdx 设为8,使用离线模式。

下载数据集:http://graphics.stanford.edu/projects/bundlefusion/

将s_binaryDumpSensorFile = "../data/apt0.sens";设置为你自己的数据集路径。

回到程序里直接ctrl+f5运行即可。注意此时可能会出现一些GPU原因导致的程序运行一段时间就退出的现象:可以尝试调节zParametersDefault.txt里的以下几个参数:s_SDFVoxelSize = 0.010f;s_hashNumSDFBlocks = 200000;或者更新一下驱动。我是用上述的参数值可以完整重建离线数据的。此外,如果你在最终保存时出现超出最大面片数的提示,并且保存的模型上面有很多孔洞,可以调节这个参数:s_marchingCubesMaxNumTriangles = 6000000; 

Kinect V2 实时重建:

将GlobalAppState.h中这样修改:

//#define KINECT
#define KINECT_ONE
//#define OPEN_NI
#define BINARY_DUMP_READER
//#define INTEL_SENSOR
//#define REAL_SENSE
//#define STRUCTURE_SENSOR
#define SENSOR_DATA_READER

#define RUN_MULTITHREADED

然后对 DepthSensing.cpp 做如下修改:
将987行的

bGotDepth = g_CudaImageManager->process()


替换为

bool bGotDepth;
while (!(bGotDepth = g_CudaImageManager->process()));

Release编译,编译成功。

将zParametersDefault.txt中的s_sensorIdx 设为2,使用KinectOne进行数据采集。

接入kinect v2,回到程序里直接ctrl+f5运行即可。

但是,值得注意的是,Kinect V2 的sdk采集的图像是个镜像,就像我们的手机前置镜头拍摄的图像一样,是左右颠倒的,因此我们重建出的场景模型也是左右颠倒的。

这时我们需要在KinectOneSensor.cpp中的setupUndistortion()函数里进行如下修改:

CameraSpacePoint cameraFrameCorners[4] = //at 1 meter distance. Take into account that depth frame is mirrored
{
  { -principalPointX / focalLengthX, principalPointY / focalLengthY, 1.f }, // LT
  { (1.f - principalPointX) / focalLengthX, principalPointY / focalLengthY, 1.f }, // RT 
  { -principalPointX / focalLengthX, (principalPointY - 1.f) / focalLengthY, 1.f }, // LB
  { (1.f - principalPointX) / focalLengthX, (principalPointY - 1.f) / focalLengthY, 1.f } // RB
};

中每个点的x分量取反,取反后代码如下:

CameraSpacePoint cameraFrameCorners[4] = //at 1 meter distance. Take into account that depth frame is mirrored
{
  { principalPointX / focalLengthX, principalPointY / focalLengthY, 1.f }, // LT
  { -(1.f - principalPointX) / focalLengthX, principalPointY / focalLengthY, 1.f }, // RT 
  { principalPointX / focalLengthX, (principalPointY - 1.f) / focalLengthY, 1.f }, // LB
  { -(1.f - principalPointX) / focalLengthX, (principalPointY - 1.f) / focalLengthY, 1.f } // RB
};

再运行,则模型不在有镜像问题~

成功~~~

 

 

参考方法:

https://bericht.neopostmodern.com/posts/artist-guide-to-bundlefusion

https://blog.csdn.net/forever__1234/article/details/86645567

 

实时全局一致的3D重建,使用动态表面重新整合技术实时,高品质,大尺寸场景的3D扫描是混合现实和机器人应用的关键。然而,可扩展性带来了姿态估计漂移的挑战,在累积模型中引入了显着的错误。方法通常需要几个小时的离线处理来全局纠正模型错误。最近的在线方法证明了令人信服的结果,但遭受以下缺点:(1)需要几分钟的时间才能执行在线修正,影响了真正的实时使用; (2)脆弱的帧到帧(或帧到模型)姿态估计导致许多跟踪失败;或(3)仅支持非结构化的基于点的表示,这限制了扫描质量和适用性。我们通过一个新颖的,实时的端对端重建框架来系统地解决这些问题。其核心是强大的姿态估计策略,通过考虑具有高效分层方法的RGB-D输入的完整历史,针对全局摄像机姿态优化每帧。我们消除了对时间跟踪的严重依赖,并且不断地将其定位到全局优化的帧。我们提出了一个可并行化的优化框架,它采用基于稀疏特征和密集几何和光度匹配的对应关系。我们的方法估计全局最优化(即,束调整的姿势)实时,支持从总跟踪故障(即重新定位)恢复的鲁棒跟踪,并实时重新估计3D模型以确保全局一致性;都在一个框架内。我们优于最先进的在线系统,质量与离线方法相同,但速度和扫描速度前所未有。我们的框架导致尽可能简单的扫描,使用方便和高质量的结果。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值