您的位置:首页 > 其它

Kinectfusion开源实现_配置Kinfu环境_Cmake编译PCL点云库_Kinect3D重建

2017-01-17 13:28 567 查看


Kinectfusion开源实现-配置Kinfu环境-Cmake编译PCL点云库

注:

1、此教程在win10_x64、VS2010_x86环境下,配置运行Kinfu、编译PCL点云库成功,其他环境也可参考;

2、主要参考前辈的博客http://blog.csdn.net/yzheately/article/details/50938322,然后加入自己遇到的问题及解决方案;

3、若想使用kinfu请使用vs2010,
Kinect一代,根据网上博客说OpenNI不支持二代,以后可以考虑用2代的官方驱动来读取Kinect2的数据,如果有人使用2代运行Kinfu成功的欢迎将方法分享在评论里。

1、准备

1.1工具准备

VS2010_x86(http://www.xiazaiba.com/html/4614.html也可以自己找)

cmake3.5.0

OpenNI1.5.7

CUDA8.0

Microsoft.NET
Framework(如果是win10系统需要)

第三方库:

boost_1.60.0

eigen3.2.8

qhull_2015.2

VTK_7.0.0

flann_1.8.4

PCL源码

另外还可以根据需要下载安装microsoftmpi,在编译boost时,编译该功能,不需要就算了。

以上的软件和库,我打包放在了百度云盘:http://pan.baidu.com/s/1c1Rh3C

1.2安装配置OpenNI
a、准备
OpenNI-Win32-1.5.7.10-Dev.msi
nite-win32-1.5.2.21-dev.msi
SensorKinect093-Bin-Win32-v5.1.2.1.msi(上面百度云盘里有)
b、设置
想用openi获取Kinect的数据则首先不能安装Kinect官方的SDK,否则SDK会屏蔽openni的驱动,之前安装的话就卸掉。另win8、win10的同学需要先设置一下电脑(win7不需要),否则在安装SensorKinect093-Bin-Win32-v5.1.2.1.msi驱动时系统会提示“文件的哈希值不在指定的目录文件中。此文件可能已损坏”的警告导致驱动安装失败。
Win10的设置方法为点击左下角->设置->更新和安全->恢复->立刻重启(等一小会)->疑难解答->高级选项(之后重启)->启动设置->禁用驱动程序强制签名(倒数第三个,对应哪个数字就在键盘按几)->重启之后就可以了。
具体图文教程请参考:http://blog.sina.com.cn/s/blog_539fe4ca0102wh1x.html

c、安装
安装前请确保把旧版本的OpenNI和NITE卸载干净、第三方驱动卸载干净、Kinect不要插入电脑。依次安装OpenNI-Win32-1.5.7.10-Dev.msi、nite-win32-1.5.2.21-dev.msi、SensorKinect093-Bin-Win32-v5.1.2.1.msi(注意以下所有安装的路径最好都不要含有汉字以及空格,纯英文最好)。安装完毕后断网并且退出杀毒软件,否则会自动在网络上寻找Kinect的官方驱动,插上Kinect电源,将Kinect插入电脑,查看设备管理器,如果安装成功会出现



的图标,我的缺少了第三个Kinect
Motor,这个是控制Kinect上电机用的,无伤大雅,可以不管。如果不能自动找到驱动就右键手动更新驱动,目录在SensorKinect安装目录下。安装完成最好重启一下电脑。

d、检验

在openni目录下:C:\Program Files\openni1.5.7\Samples\Bin\Release中打开NiViewer.exe可以显示深度图;
   

在NITE目录下:C:\Program Files\PrimeSense\NITE\Samples\Bin\Release中的Sample-PointViewer.exe显示人体骨架。

都能显示表示OpenNI安装成功。



e、配置VS2010

       OpenNI安装时会自动添加环境变量所以不需要手动添加。打开VS新建项目(注意这里不是空项目),右键项目选择属性,点击配置属性下面的VC++目录,在右侧包含目录中添加你OpenNI安装目录下的include目录,我的是D:\openni1.5.7\Include



同样在库目录中添加你OpenNI安装目录下的Lib目录,我的是D:\openni1.5.7\Lib;

之后在链接器->输入->附加依赖项中添加openNI.lib(和你Lib目录下的名字一定要一样否则编译时会报错提示打不开openNI.lib)



在工程下的源文件中打开stdafx.cpp,添加如下程序,运行成功看到深度图和彩色图表示OpenNI安装配置成功:

(此程序用OpenCV显示深度图和彩色图,安装配置OpenCV的教程网上很多也很成熟,不多赘述。)

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include <string>
#include <XnCppWrapper.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"

using namespace std;
using namespace cv;

void CheckOpenNIError( XnStatus result, string status )
{
if( result != XN_STATUS_OK )
cerr << status << " Error: " << xnGetStatusString( result ) << endl;
}

int main( int argc, char** argv )
{
XnStatus result = XN_STATUS_OK;
xn::DepthMetaData depthMD;
xn::ImageMetaData imageMD;

//OpenCV
IplImage*  imgDepth16u=cvCreateImage(cvSize(640,480),IPL_DEPTH_16U,1);
IplImage* imgRGB8u=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
IplImage*  depthShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
IplImage* imageShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
cvNamedWindow("depth",1);
cvNamedWindow("image",1);
char key=0;
xn::Context context;
result = context.Init();
CheckOpenNIError( result, "initialize context" );

xn::DepthGenerator depthGenerator;
result = depthGenerator.Create( context );
CheckOpenNIError( result, "Create depth generator" );
xn::ImageGenerator imageGenerator;
result = imageGenerator.Create( context );
CheckOpenNIError( result, "Create image generator" );

XnMapOutputMode mapMode;
mapMode.nXRes = 640;
mapMode.nYRes = 480;
mapMode.nFPS = 30;
result = depthGenerator.SetMapOutputMode( mapMode );
result = imageGenerator.SetMapOutputMode( mapMode );

depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator );

result = context.StartGeneratingAll();
result = context.WaitNoneUpdateAll();

while( (key!=27) && !(result = context.WaitNoneUpdateAll( ))  )
{
//get meta data
depthGenerator.GetMetaData(depthMD);
imageGenerator.GetMetaData(imageMD);

memcpy(imgDepth16u->imageData,depthMD.Data(),640*480*2);
cvConvertScale(imgDepth16u,depthShow,255/4096.0,0);
memcpy(imgRGB8u->imageData,imageMD.Data(),640*480*3);
cvCvtColor(imgRGB8u,imageShow,CV_RGB2BGR);
cvShowImage("depth", depthShow);
cvShowImage("image",imageShow);
key=cvWaitKey(20);
}
cvDestroyWindow("depth");
cvDestroyWindow("image");
cvReleaseImage(&imgDepth16u);
cvReleaseImage(&imgRGB8u);
cvReleaseImage(&depthShow);
cvReleaseImage(&imageShow);
context.StopGeneratingAll();
context.Shutdown();
return 0;
}


2、编译第三方库

提醒: 

1、PCL编译过程请联网!VS在编译VTK时需要自动下载一些文件,否则会编译失败!

2、第三方库最好都安装在默认目录。(也就是在后面cmake中设置CMAKE_INSTALL_PREFIX的值时,用默认目录)

2.1编译boost

若需要mpi则首先下载安装它(上面网盘里有),然后到boost_1_60_0\tools\build\src\tools\mpi.jam中修改下面几行:

249-251 line

 

local microsoft_mpi_sdk_path = "C:\\Program Files (x86)\\Microsoft SDKs\\MPI" ;

local microsoft_mpi_path = "C:\\Program Files\\Microsoft MPI" ;

    if [ GLOB $(microsoft_mpi_sdk_path)\\Include : mpi.h ]

260-262 line

 

options = <include>$(microsoft_mpi_sdk_path)/Include

          <address-model>64:<library-path>$(microsoft_mpi_sdk_path)/Lib/x64

          <library-path>$(microsoft_mpi_sdk_path)/Lib/x86

268 line

 

.mpirun = "\"$(microsoft_mpi_path)\\Bin\\mpiexec.exe"\" ;

 

然后以管理员身份运行VS自带的cmd(“VS2010 工具下的Visual Studio命令提示符”),进入boost文件夹,运行bootstrap.bat,运行结束后会生成project-config.jam,



这里用到的简单cmd命令:

1、“d:”:进入d盘根目录,这里要进入你的安装盘

2、“dir”:查看当前所在目录的文件和文件夹

3、“cd name”:进入当前文件夹下的name文件夹中(name是想进入文件夹的名字,这里就是boost)

4、“name”:打开当前文件夹下名为name的文件,这里是bootstrap.bat,运行结束后会生成project-config.jam



打开project-config.jam并在第四行加上:using mpi ;(注意“;”前面有一个空格!) 接下来还是用cmd进入boost文件夹,运行如下命令编译boost:

(这里一定要注意,如果你的VS和第三方库都是32位的就只使用下面Win32环境的命令,64位只用X64环境的命令,我一开始两个都编译了结果到后面用VS生成PCL的时候生成失败了)

Win32环境:

b2.exe toolset=msvc-10.0 address-model=32 --build-dir=build\x86 install --prefix="C:\Program Files (x86)\Boost" -j8

X64环境:

b2.exe toolset=msvc-10.0 address-model=64 --build-dir=build\x64 install --prefix="C:\Program Files\Boost" -j8

        其中msvc-10.0代表vs2010,msvc-11.0代表vs2012,如果是12.0是vs2013,14.0是vs2015。后面的C:\Program Files\Boost是boost的安装文件夹,你要换成你自己的安装目录。然后等着就好了,时间有点久(大约20分钟),耐心等。完成后在环境变量中建立BOOST_ROOT变量,值为boost文件夹安装地址,比如C:\Program
Files\Boost.



2.2编译eigen

 

        使用cmake,分别设置eigen的source和build路径(source路径其实就是含有CMakeLists.txt的文件夹,其实就是source的根目录,我的路径是E:\pcl\Eigen),如build不存在,点击Configure会提示新建build文件夹,选择vs10-2010编译器,这里注意Configure时有CMAKE_INSTALL_PREFIX这个选项,默认为C:\Program
Files\Eigen.这里的路径即为该软件最后的安装路径(也是环境变量中要设置的EIGEN_ROOT的路径,可设置为你想要的其它路径,后边的FLANN,QHULL,VTK也是一样道理).然后Generate在build目录下生成VS工程。

        之后以管理员身份运行VS2010(否则install时会失败),打开bulid文件夹下的eigen.sln工程,待加加完文件后,生成ALL_BUILD(Debug和 Release均要生成),完成后生成INSTALL(Debug and Release)就在那一大堆工程里,一般就在ALL_BUILD的下面。可以看到eigen安装路径中出现include文件夹。最后在环境变量中建立EIGEN_ROOT变量,值为eigen的安装路径。

2.3编译qhull

 

        使用cmake,分别设置qhull的source和build路径,如build不存在,点击Configure会提示新建build文件夹,选择vs10-2010编译器.注意根据需要修改CMAKE_INSTALL_PREFIX,然后添加一个entry:



Name: CMAKE_DEBUG_POSTFIX

 

Type: STRING

 

Value: -d

 

       修改完后再次点Configure,然后Generate。以管理员身份运行VS2010并打开qhull.sln工程文件,待加载完文件后,完成后生成ALL_BUILD(debug和release),然后生成INSTALL(Debugand Release)。完成后可以看到qhull安装路径中出现include和lib文件夹。最后在环境变量中建立QHULL_ROOT变量,值为qhull安装地址。

 

2.4编译VTK

 

        使用cmake,分别设置VTK的source和build路径,如build不存在,点击Configure会提示新建build文件夹,选择vs10-2010编译器.注意根据需要修改CMAKE_INSTALL_PREFIX选项,然后添加一个entry:

 

Name: CMAKE_DEBUG_POSTFIX

 

Type: STRING

 

Value: -gd

 

        修改完后再次点Configure,然后Generate。以管理员身份运行VS2010并打开VTK.sln工程文件,待加载完文件后,生成ALL_BUILD(debug和release)(时间有点久,很久,有时各自需要一两个小时,最快一般也要半个小时,耐心等待),完成后生成install(debug和release)。完成后可以看到VTK文件夹中出现include和lib文件夹。最后在环境变量中建立VTK_ROOT,为VTK安装路径.

 

2.5编译flann

 

        使用cmake,分别设置Flann的source和build路径(如C:\flann,C:\flann\build),选择vs10-2010编译器.注意根据需要修改CMAKE_INSTALL_PREFIX,然后去掉BULID_MATLAB_BINDINGS和BULID_PYTHON_BINDINGS的勾选,不bulid它们



然后添加一个entry:

 

Name: CMAKE_DEBUG_POSTFIX

 

Type: STRING

 

Value: -gd

 

        修改完后再次点Configure,然后Generate。在C:\flann\src\cpp\flann\util(源码)中找到serialization.h文件 在92行BASIC_TYPE_SERIALIZER(bool)之后加入以下代码:

 

#ifdef _MSC_VER

 

BASIC_TYPE_SERIALIZER( unsigned __int64 );//注意此处__int64是两个下划线连一起

 

#endif

 
        修改完后以管理员身份运行VS2010并打开flann.sln工程文件,待加载完文件后,(debug和release)生成all_build,完成后生成install(Debugand Release)。完成后可以看到flann安装路径下出现include和lib文件夹。最后在环境变量中建立FLANN_ROOT变量,值为flann安装路径。
 
2.6安装CUDA
 
        最好安装最新版的CUDA,安装CUDA过程中不要用默认的精简安装,选择自定义,全选后继续安装,安装完毕重启下电脑。
推荐教程:http://www.cnblogs.com/xing901022/p/3248469.html
注意:
1、一定要先安装VS2010,再安装CUDA,不然CUDA会找不到编译器导致在VS2010中不能使用CUDA
2、系统是win10的话还需要安装一个Microsoft.NET Framework(去百度一搜Microsoft.NET Framework下载,上面网盘里也有)不然会报错,我安装的是3.5。
3、在选项->选择安装位置时不能选择一开始的解压目录下,不然安装完成后解压目录会被删除,安装的文件也会随之删除造成失败
4、配置VS时我选择的是手动配置,也不难



按上面教程里的程序运行,出现这样的控制台窗口显示sum(CPU)就说明安装好了



2.7最后配置PCL(重头戏)

 

        可以在Githubhttps://github.com/PointCloudLibrary/pcl点击网页右上方的Clone
or download即可下载到PCL最新的源码。

        使用cmake选择source和build文件夹,点击Configure(此时最好把Grouped和Advanced勾选,),选择vs10-2010编译器,正常情况下不会出现什么问题:(警告可以忽略,如果出现错误八成是前面的库没有配置好,按照错误提示去修改) 运行完展开bulid,可以选择我们要编译的模块,有些模块不能勾选,否则生成会出错,具体勾选哪些模块参考下面截图,如果漏选可能会导致生成的VS工程中没有Kinfu_larger_Scale这个解决方案。其中如果要使用kinfu需要勾选GPU,以及CUDA,还要勾选WITH下面的openni:





参考的博客里说有时在configure后会出现找不到Boost的情况(我没有遇到),解决办法是手动添加,下面是Boost下拉栏中的截图,可以作为参考,配置那些没有找到的库: 



如果VTK没有找到,可手动添加,它自己找到的话就不用管了:



        注意根据需要修改CMAKE_INSTALL_PREFIX(我的路径为C:\ProgramFiles\PCL),再次点击Configure,检查BUILD目录下有没有BUILD_gpu_kinfu_large_scale 并且确认勾选(没有的话生成的工程中就没有Kinfu_larger_Scale)



        然后generate生成.以管理员身份运行VS2010并打开PCL.sln,生成ALL_BUILD(Debug和Release模式,各自得半小时左右). 随后生成INSTALL(Debug and Release),最后在环境变量中建立PCL_ROOT变量,值为PCL安装路径。PCL成功安装!!!

想看Kinfu_larger_scale的运行效果只需用VS2010打开PCL.sln,右键pcl_kinfu_lager_scale解决方案->设置为启动项目,然后点运行即可看到效果!

耗时半个月终于弄好了啊啊啊啊啊!!!!!



如果运行提示无法定位程序输入点...于动态链接库....dll点击确定就好,不影响运行(如果有知道原因以及解决方法的欢迎通过评论告诉我)



下面附上效果图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: