配置环境如题,显卡是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