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

 

你可能感兴趣的:(bundlefusion)