新项目是3D重建,最近都在查资料看论文,关于生成3D点云,特征检测,点云匹配,曲面重建等等。有篇知乎写得不错,讲了实现3D重建的相关体系和方法。不过我也是从那里面得到了启发,方法和里面也不太相同,因为里面主要是多幅2D图像三维重建和单目三维重建,他们都没有深度信息而是通过SFM等一些算法计算出景深。而我使用的是RGBD传感器如kinect,xtion。所以我关注与3D特征检测匹配等。大家可以看看微软的KinectFusion和PCL的kinfu以及MIT的Kintinuous。关于PCL,相信能看到这篇博客的童鞋们都是知道的:Point Cloud Library是处理三维点云的第三方库,非常的强大,地位相当于opencv。PCL集成了很多有名的处理3D点云的算法,学习使用PCL以及了解背后的算法非常重要。那么进入正题,今天我来给大家讲一下如何配置PCL(博主也是走了好多弯路啊..)。
首先我们知道网上大多数都是PCL1.72以前的配置,网上有个老外的教程关于PCL1.72在win8.1,vs2012/2013/2015的配置,其中我们看到1.72还不支持opennigrabber所以只能用他提供的kinectgrabber。但是我用的是xtion不是kinect,所以我必须使用opennigrabber,怎么办呢?opennigrabber支持openni1.x但是openni1.x只支持vs2010以前 openni2.x支持新的vs但是PCL1.72不支持openni2.x。所以使用xtion的孩子怎么半呢(使用kinect的孩子们不需要担心)?要么使用单独的openni2.x去获得3D点云然后用PCL做其他研究,要么,嗯,配置PCL1.8吧哈哈。福音来了,PCL1.8开始支持openni2.x了,所以我们开始在win8.1上配置PCL1.8,使用vs2013和cmake3.3。
下载PCL1.8之前,第一步是下载配置PCL所需的第三方库(全是最新版本官网下载链接,如果国内没法下载的话大家说一下,我会上传到CSDN并给出链接):
Boost 1.59.0
Eigen 3.2.7
FLANN 1.8.4
Qhull 2012.1
VTK 6.3.0
OpenNI 2.2.0.33 Beta
除了openni2.2之外都是源码,需要使用cmake编译出include和lib,dll(Boost不同)。openni2直接安装就好,注意即使我们是64位系统,但是我们要根据开发的应用来决定下载32位还是64位的三方库。如要开发win32就下载32位,要开发x64就下载64位。接下来介绍其他5个库的配置方法:
Boost 1.59.0
首先下载微软的mpi,然后在boost\tools\build\src\tools中找到mpi.jam,修改其中的这三行:
249 line local cluster_pack_path_native = "C:\\Program Files\\Microsoft MPI" ;
251 line if [ GLOB $(cluster_pack_path_native)\\Inc : mpi.h ]
260 line options = <include>$(cluster_pack_path)/Inc
然后打开cmd,进入boost文件夹,运行: bootstrap.bat 运行结束后会生成project-config.jam,打开并在第四行加上:using mpi ;
接下来还是用cmd进入boost文件夹,运行:b2.exe toolset=msvc-12.0 address-model=32 --build-dir=build\x86 install --prefix="X:\X\Boost" -j8
注意如果要开发x64的程序而不是64位系统,请运行:b2.exe toolset=msvc-12.0 address-model=64 --build-dir=build\x64 install --prefix="X:\X\Boost" -j8
(其中没事msvc-12.0代表vs2013,如果是11.0是vs2012,14.0是vs2015 后面的X:\X\Boost是boost的文件夹,b2.exe就在里面)
然后等着就好了,时间有点久,耐心等。完成后在环境变量中建立BOOST_ROOT变量,值为boost文件夹地址X:\X\Boost
Eigen 3.2.7
这个简单,使用cmake,sourse选eigen文件夹(如C:\eigen),build目录选eigen下的build(如C:\eigen\build)。点击Configure会提示新建build文件夹,选择vs12 2013编译器(编译x64版本的话选择vs12 2013 win64),然后注意找到CMAKE_INSTALL_PREFIX这个选项,很重要,默认为C:\Program Files (x86)\Eigen,请修改为你的eigen所在文件夹,如上面的C:\eigen,不然在之后的install会出错。修改完后再次点Configure,然后Generate。在eigen\build文件夹中打开eigen.sln工程文件,待加载完文件后,生成all_build,完成后生成install。完成后可以看到eigen文件夹中出现include。(PS:没有生成lib,所以debug或者release都无所谓,include都一样)最后在环境变量中建立EIGEN_ROOT变量,值为eigen文件夹地址。
FLANN 1.8.4
使用cmake,sourse选flann文件夹(如C:\flann),build目录选flann下的build(如C:\flann\build)。点击Configure会提示新建build文件夹,选择vs12 2013编译器(编译x64版本的话选择vs12 2013 win64),然后注意找到CMAKE_INSTALL_PREFIX这个选项,很重要,默认为C:\Program Files (x86)\flann,请修改为你的flann所在文件夹,如上面的C:\flann,不然在之后的install会出错。然后添加一个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 );
#endif
修改完后在flann\build文件夹中打开flann.sln工程文件,待加载完文件后,(debug和release)生成all_build,完成后生成install。完成后可以看到flann文件夹中出现include和lib文件夹。最后在环境变量中建立FLANN_ROOT变量,值为flann文件夹地址。
Qhull 2012.1
使用cmake,sourse选qhull文件夹(如C:\qhull),build目录选qhull下的build(如C:\qhull\build)。点击Configure(不会提示创建build文件夹因为build已经存在),选择vs12 2013编译器(编译x64版本的话选择vs12 2013 win64),然后注意找到CMAKE_INSTALL_PREFIX这个选项,很重要,默认为C:\Program Files (x86)\qhull,请修改为你的qhull所在文件夹,如上面的C:\qhull,不然在之后的install会出错。然后添加一个entry:
Name: CMAKE_DEBUG_POSTFIX
Type: STRING
Value: -d
修改完后再次点Configure,然后Generate。在qhull\build文件夹中打开qhull.sln工程文件,待加载完文件后,修改libqhull和user_eg2的项目属性,C/C++ -> 高级 -> 编译为 C++ 代码 (/TP),完成后生成all_build(debug和release)即可,然后生成install。完成后可以看到qhull文件夹中出现include和lib文件夹。最后在环境变量中建立QHULL_ROOT变量,值为qhull文件夹地址。
VTK 6.3.0
使用cmake,sourse选VTK文件夹(如C:\VTK),build目录选VTK下的build(如C:\VTK\build)。点击Configure会提示新建build文件夹,选择vs12 2013编译器(编译x64版本的话选择vs12 2013 win64),然后注意找到CMAKE_INSTALL_PREFIX这个选项,很重要,默认为C:\Program Files (x86)\VTK,请修改为你的VTK所在文件夹,如上面的C:\VTK,不然在之后的install会出错。然后添加一个entry:
Name: CMAKE_DEBUG_POSTFIX
Type: STRING
Value: -gd
修改完后再次点Configure,然后Generate。在VTK\build文件夹中打开VTK.sln工程文件,待加载完文件后,(debug和release)生成all_build(时间有点久,耐心等待),完成后生成install。完成后可以看到VTK文件夹中出现include和lib文件夹。最后在环境变量中建立VTK_ROOT变量,值为VTK文件夹地址。
第三方库都配置好后开始配置PCL1.8:
使用cmake:
Where is the source code: C:\PCL-master
Where is build the binaries: C:\PCL-master\build
点击Configure提示新建build文件夹,选择vs12 2013编译器(编译x64版本的话选择vs12 2013 win64),正常情况下不会出现什么问题,修改CMAKE_INSTALL_PREFIX为C:\PCL-master,再次点击Configure,然后generate生成PCL.sln。下图是显示在cmake中的结果:
(如果出现找不到eigen,vtk等等说明环境变量没搞好,修改并重启。建议上面配置好第三方库时重启电脑使环境变量生效)打开PCL.sln并生成all_build(时间很久,耐心等待),下图为all_build成功结果截图:
然后到build文件夹中找到cmake_install.cmake修改第46行:file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/3rdParty/Boost" TYPE DIRECTORY FILES "X:/X/Boost/" REGEX "/[^/]*\\/uninstall\\.exe$" EXCLUDE) 其中X:/X/Boost/为boost所在文件夹。我电脑上只有boost这个出现了错误,大家可以检查一下上下文中其他第三方库的文件夹地址有没有正确,错误的可以改正。下图是我这里的cmake_install.cmake的这一部分:
然后生成install即可(debug和release)。成功截图如下:
最后在环境变量中建立PCL_ROOT变量,值为PCL文件夹地址。在PATH中加入%PCL_ROOT%\bin;%PCL_ROOT%\3rdParty\FLANN\bin;%PCL_ROOT%\3rdParty\VTK\bin
大家可以到C:\PCL-master\test中找到大量的xx.pcd点云文件,拷贝到bin中,然后使用cmd进入bin文件夹,运行 pcl_viewer_debug.exe xx.pcd或者pcl_viewer_release.exe xx.pcd来观察三维点云。我选了一个five_people.pcd,结果如下:
最后再给大家看一张我使用pclwrite类保存的pcd文件的view:
关于PCL1.8的配置就到这里为止,欢迎大家和我讨论PCL~!
================================================================
2016/03/11补充:
6个第三方库和PCL库我放在了百度网盘里。(链接: http://pan.baidu.com/s/1hrv9CGW 密码: gbr3)