简述
PCL(Point Cloud Library)作为一个优秀的点云库,目前已经开源并且集成了许多优秀学者提出的高效的算法,值得深入学习。本文将以Windows 10和Visual Studio 2017开发环境为例,讲解如何配置点云库。
环境
- Windows
- Visual Studio
准备工作
安装Visual Studio
教程中使用的是Visual Studio 2017 Enterprise版本,具体的安装方式可从其他网站中搜索到,在此不做赘述。
安装PCL 1.9
首先去https://github.com/PointCloudLibrary/pcl/releases下载点云库的安装包,我们需要的是AllInOne
和pdb
两个包。截止到此教程发布的时间,点云库的最新版本是1.8.1,如下图所示。
在这里需要根据自己机器的情况下载相应的版本(操作系统的位数,以及Visual Studio的版本)。我这里选择PCL-1.9.1-AllInOne-msvc2017-win64.exe
和pcl-1.9.1-pdb-msvc2017-win64.zip
两个文件。
这两个包根据网速不同,下载的时间也不同,耐心等待即可。
下载结束之后,运行我们下载得到的PCL-1.9.1-AllInOne-msvc2017-win64.exe
文件进行安装。下面几幅图显示出了几个必要的步骤,未做说明的步骤直接下一步或者根据自己的喜好配置即可。
我在安装这类库相关的软件的时候都会尽量避免在路径中带有空格,因为有些软件在检查路径的时候可能会由于空格引发各种问题。因此我把默认的路径中的空格换成了下划线_
。当然,Windows默认的Program Files目录无视这条规则,毕竟微软自己设置的目录名不会出现路径的问题。因此,我这里设置的路径是C:\Program Files\PCL_1_8_1
。
这里需要配置需要安装的其他库,如果自己不确定到底有没有其他的软件安装过相关的库,那么就全部都勾选了,否则由于库的缺失,点云库就不能正常工作。
接下来点击安装
便可以开始漫长的安装过程。
一段时间之后,会弹出来一个OpenNI2的安装窗口,此时直接一路下一步就好,但是一定要记住自己设置的安装路径。由于点云在安装的过程中会把所有的第三方库全部安装在点云安装目录下的3rdparty
文件夹里。因此,为了保持文件夹的整洁,我这里也把OpenNI2安装在3rdparty
文件夹里,即C:\Program Files\PCL_1_9_1\3rdParty\OpenNI2
。
OpenNI2安装结束之后就完成了点云库的完整安装,安装目录下的样子和3rdparty
文件夹下的样子如下图:
可以看到,我把所有的第三方库全部安装到了3rdparty
文件夹中。
环境变量配置
点云库安装完成之后,还有一个比较重要的步骤,就是配置Windows的环境变量。
右键点击此电脑(我的电脑,计算机,这台电脑等名字)
,选择属性
,接着点击左侧的高级系统设置
,然后选择高级
选项卡,点击下面的环境变量...
按钮,此时便打开了环境变量的配置窗口。
此时,我们可以看到PCL的根目录以及OpenNI2的目录已经添加到了系统变量
中。
然后,我们双击系统变量
中的Path
,再将以下的目录添加到Path
中(注意最后一个OpenNI2的路径,要和自己刚刚安装的路径一样才行):
| |
如果用的电脑的操作系统是Windows 10的话,就上面几个路径一个一个复制下来,然后添加到Path
的窗格中即可,非常方便,如下图所示:
如果是其他版本的Windows系统,则需要把上面的几个路径写成下面的这种形式,然后叠加到Path
环境变量的后面(具体的做法可以去搜索Windows 7环境变量的配置方式):
| |
以上步骤搞定之后,重启电脑来应用环境变量。
Visual Studio开发环境配置
Visual Studio的环境配置比较麻烦,经常一堆错误。因此,下面的步骤需要仔细的按照步骤做。
Visual Studio提供了两种编译模式:Debug和Release。Debug模式下,生成的应用程序中会插入许多的调试指令,因此调试起来及其方便,但是大幅度降低了程序的运行速度;Release模式便会提高程序的速度,但是调试相对较困难一些(具体的区别请自行去Baidu或者Google)。在某些需求下,可能需要处理大量的数据,因此需要使用Release模式生成应用程序。本教程将对两种模式分别进行配置,适应不同的需求。
首先打开Visual Studio,然后新建一个C++工程,我这里创建的C++工程名字是pcl_test
。具体创建过程在此不做赘述,如下图所示:
接下来,右键点击解决方案管理器
中的pcl_test
,然后选择属性
。这时便打开了项目属性窗口。
我们先来配置Debug模式。首先在窗口最上方选择Debug
,然后选择自己在下载点云库时候选择的平台,我这里选择x64
(注意这里一定不要选错),如下图所示:
接着点击该窗口左侧的VC++ 目录
,然后点击右侧的包含目录
右侧的下拉菜单,选择编辑...
,将以下目录填入窗口中(根据自己的安装路径进行调整):
- C:\Program Files\PCL_1_9_1\3rdParty\OpenNI2\Include
- C:\Program Files\PCL_1_9_1\include\pcl-
1.9
- C:\Program Files\PCL_1_9_1\3rdParty\VTK\include\vtk-
8.0
- C:\Program Files\PCL_1_9_1\3rdParty\QHull\include
- C:\Program Files\PCL_1_9_1\3rdParty\FLANN\include
- C:\Program Files\PCL_1_9_1\3rdParty\Eigen\eigen
3
- C:\Program Files\PCL_1_9_1\3rdParty\Boost\include\boost-
1_64
注意:这里的C:\Program Files\PCL_1_9_1
是刚刚安装点云库的路径,根据刚刚安装点云的路径进行修改。同时还要注意高亮字体的版本问题,需要打开相关目录进行检查。比如我这里的vtk就是8.0
的,而boost是1.64
版本的。配置好之后点击确定
即可如下图所示:
然后点击右侧的库目录
右侧的下拉菜单,选择编辑...
,将以下目录填入窗口中:
- C:\Program Files\PCL_1_8_1\3rdParty\OpenNI2\Lib
- C:\Program Files\PCL_1_8_1\3rdParty\VTK\lib
- C:\Program Files\PCL_1_8_1\3rdParty\Qhull\lib
- C:\Program Files\PCL_1_8_1\3rdParty\FLANN\lib
- C:\Program Files\PCL_1_8_1\3rdParty\Boost\lib
- C:\Program Files\PCL_1_8_1\lib
同样需要注意路径问题,配置好之后点击确定
即可,如下图所示:
然后点击属性页中的C/C++
下的预处理器
,点击右侧的预处理器定义
右侧的下拉菜单,选择编辑...
,添加如下两条定义:
| |
如果不添加上述两行预编译,在程序运行时会报错:
然后再点击预编译头
,将右侧的预编译头
设置为不使用预编译头
。这个设置可以依据自己的习惯决定,可以省略。
接着点击属性页中的链接器
下的输入
,点击右侧的附加依赖项
右侧的下拉菜单,选择编辑...
,将如下文件名填写到窗口中:
pcl_common_debug.lib
pcl_features_debug.lib
pcl_filters_debug.lib
pcl_io_ply_debug.lib
pcl_io_debug.lib
pcl_kdtree_debug.lib
pcl_keypoints_debug.lib
pcl_ml_debug.lib
pcl_octree_debug.lib
pcl_outofcore_debug.lib
pcl_people_debug.lib
pcl_recognition_debug.lib
pcl_registration_debug.lib
pcl_sample_consensus_debug.lib
pcl_search_debug.lib
pcl_segmentation_debug.lib
pcl_stereo_debug.lib
pcl_surface_debug.lib
pcl_tracking_debug.lib
pcl_visualization_debug.lib
libboost_atomic-vc141-mt-gd-x64-1_68.lib
libboost_bzip2-vc141-mt-gd-x64-1_68.lib
libboost_chrono-vc141-mt-gd-x64-1_68.lib
libboost_container-vc141-mt-gd-x64-1_68.lib
libboost_context-vc141-mt-gd-x64-1_68.lib
libboost_coroutine-vc141-mt-gd-x64-1_68.lib
libboost_date_time-vc141-mt-gd-x64-1_68.lib
libboost_exception-vc141-mt-gd-x64-1_68.lib
libboost_fiber-vc141-mt-gd-x64-1_68.lib
libboost_filesystem-vc141-mt-gd-x64-1_68.lib
libboost_graph-vc141-mt-gd-x64-1_68.lib
libboost_graph_parallel-vc141-mt-gd-x64-1_68.lib
libboost_iostreams-vc141-mt-gd-x64-1_68.lib
libboost_locale-vc141-mt-gd-x64-1_68.lib
libboost_log-vc141-mt-gd-x64-1_68.lib
libboost_log_setup-vc141-mt-gd-x64-1_68.lib
libboost_math_c99-vc141-mt-gd-x64-1_68.lib
libboost_math_c99f-vc141-mt-gd-x64-1_68.lib
libboost_math_c99l-vc141-mt-gd-x64-1_68.lib
libboost_math_tr1-vc141-mt-gd-x64-1_68.lib
libboost_math_tr1f-vc141-mt-gd-x64-1_68.lib
libboost_math_tr1l-vc141-mt-gd-x64-1_68.lib
libboost_mpi-vc141-mt-gd-x64-1_68.lib
libboost_numpy37-vc141-mt-gd-x64-1_68.lib
libboost_numpy27-vc141-mt-gd-x64-1_68.lib
libboost_prg_exec_monitor-vc141-mt-gd-x64-1_68.lib
libboost_program_options-vc141-mt-gd-x64-1_68.lib
libboost_python37-vc141-mt-gd-x64-1_68.lib
libboost_python27-vc141-mt-gd-x64-1_68.lib
libboost_random-vc141-mt-gd-x64-1_68.lib
libboost_regex-vc141-mt-gd-x64-1_68.lib
libboost_serialization-vc141-mt-gd-x64-1_68.lib
libboost_signals-vc141-mt-gd-x64-1_68.lib
libboost_system-vc141-mt-gd-x64-1_68.lib
libboost_test_exec_monitor-vc141-mt-gd-x64-1_68.lib
libboost_thread-vc141-mt-gd-x64-1_68.lib
libboost_timer-vc141-mt-gd-x64-1_68.lib
libboost_type_erasure-vc141-mt-gd-x64-1_68.lib
libboost_unit_test_framework-vc141-mt-gd-x64-1_68.lib
libboost_wave-vc141-mt-gd-x64-1_68.lib
libboost_wserialization-vc141-mt-gd-x64-1_68.lib
libboost_zlib-vc141-mt-gd-x64-1_68.lib
flann-gd.lib
flann_cpp-gd.lib
flann_cpp_s-gd.lib
flann_s-gd.lib
qhull_d.lib
qhullcpp_d.lib
qhullstatic_d.lib
qhullstatic_r_d.lib
qhull_p_d.lib
qhull_r_d.lib
vtkalglib-8.1-gd.lib
vtkChartsCore-8.1-gd.lib
vtkCommonColor-8.1-gd.lib
vtkCommonComputationalGeometry-8.1-gd.lib
vtkCommonCore-8.1-gd.lib
vtkCommonDataModel-8.1-gd.lib
vtkCommonExecutionModel-8.1-gd.lib
vtkCommonMath-8.1-gd.lib
vtkCommonMisc-8.1-gd.lib
vtkCommonSystem-8.1-gd.lib
vtkCommonTransforms-8.1-gd.lib
vtkDICOMParser-8.1-gd.lib
vtkDomainsChemistry-8.1-gd.lib
vtkexoIIc-8.1-gd.lib
vtkexpat-8.1-gd.lib
vtkFiltersAMR-8.1-gd.lib
vtkFiltersCore-8.1-gd.lib
vtkFiltersExtraction-8.1-gd.lib
vtkFiltersFlowPaths-8.1-gd.lib
vtkFiltersGeneral-8.1-gd.lib
vtkFiltersGeneric-8.1-gd.lib
vtkFiltersGeometry-8.1-gd.lib
vtkFiltersHybrid-8.1-gd.lib
vtkFiltersHyperTree-8.1-gd.lib
vtkFiltersImaging-8.1-gd.lib
vtkFiltersModeling-8.1-gd.lib
vtkFiltersParallel-8.1-gd.lib
vtkFiltersParallelImaging-8.1-gd.lib
vtkFiltersPoints-8.1-gd.lib
vtkFiltersProgrammable-8.1-gd.lib
vtkFiltersSelection-8.1-gd.lib
vtkFiltersSMP-8.1-gd.lib
vtkFiltersSources-8.1-gd.lib
vtkFiltersStatistics-8.1-gd.lib
vtkFiltersTexture-8.1-gd.lib
vtkFiltersTopology-8.1-gd.lib
vtkFiltersVerdict-8.1-gd.lib
vtkfreetype-8.1-gd.lib
vtkGeovisCore-8.1-gd.lib
vtkgl2ps-8.1-gd.lib
vtkhdf5-8.1-gd.lib
vtkhdf5_hl-8.1-gd.lib
vtkImagingColor-8.1-gd.lib
vtkImagingCore-8.1-gd.lib
vtkImagingFourier-8.1-gd.lib
vtkImagingGeneral-8.1-gd.lib
vtkImagingHybrid-8.1-gd.lib
vtkImagingMath-8.1-gd.lib
vtkImagingMorphological-8.1-gd.lib
vtkImagingSources-8.1-gd.lib
vtkImagingStatistics-8.1-gd.lib
vtkImagingStencil-8.1-gd.lib
vtkInfovisCore-8.1-gd.lib
vtkInfovisLayout-8.1-gd.lib
vtkInteractionImage-8.1-gd.lib
vtkInteractionStyle-8.1-gd.lib
vtkInteractionWidgets-8.1-gd.lib
vtkIOAMR-8.1-gd.lib
vtkIOCore-8.1-gd.lib
vtkIOEnSight-8.1-gd.lib
vtkIOExodus-8.1-gd.lib
vtkIOExport-8.1-gd.lib
vtkIOExportOpenGL-8.1-gd.lib
vtkIOGeometry-8.1-gd.lib
vtkIOImage-8.1-gd.lib
vtkIOImport-8.1-gd.lib
vtkIOInfovis-8.1-gd.lib
vtkIOLegacy-8.1-gd.lib
vtkIOLSDyna-8.1-gd.lib
vtkIOMINC-8.1-gd.lib
vtkIOMovie-8.1-gd.lib
vtkIONetCDF-8.1-gd.lib
vtkIOParallel-8.1-gd.lib
vtkIOParallelXML-8.1-gd.lib
vtkIOPLY-8.1-gd.lib
vtkIOSQL-8.1-gd.lib
vtkIOTecplotTable-8.1-gd.lib
vtkIOVideo-8.1-gd.lib
vtkIOXML-8.1-gd.lib
vtkIOXMLParser-8.1-gd.lib
vtkjpeg-8.1-gd.lib
vtkjsoncpp-8.1-gd.lib
vtklibharu-8.1-gd.lib
vtklibxml2-8.1-gd.lib
vtklz4-8.1-gd.lib
vtkmetaio-8.1-gd.lib
vtkNetCDF-8.1-gd.lib
vtknetcdfcpp-8.1-gd.lib
vtkoggtheora-8.1-gd.lib
vtkParallelCore-8.1-gd.lib
vtkpng-8.1-gd.lib
vtkproj4-8.1-gd.lib
vtkRenderingAnnotation-8.1-gd.lib
vtkRenderingContext2D-8.1-gd.lib
vtkRenderingContextOpenGL-8.1-gd.lib
vtkRenderingCore-8.1-gd.lib
vtkRenderingFreeType-8.1-gd.lib
vtkRenderingGL2PS-8.1-gd.lib
vtkRenderingImage-8.1-gd.lib
vtkRenderingLabel-8.1-gd.lib
vtkRenderingLIC-8.1-gd.lib
vtkRenderingLOD-8.1-gd.lib
vtkRenderingOpenGL-8.1-gd.lib
vtkRenderingVolume-8.1-gd.lib
vtkRenderingVolumeOpenGL-8.1-gd.lib
vtksqlite-8.1-gd.lib
vtksys-8.1-gd.lib
vtktiff-8.1-gd.lib
vtkverdict-8.1-gd.lib
vtkViewsContext2D-8.1-gd.lib
vtkViewsCore-8.1-gd.lib
vtkViewsInfovis-8.1-gd.lib
vtkzlib-8.1-gd.lib
opengl32.lib
这时,点击确定,我们在Debug模式下的点云开发环境就配置完成了。去网上找个实例代码粘贴,如果成功编译运行就代表配置成功了。注意:这些文件名中涉及到版本问题。libboost_atomic-vc141-mt-gd-1_64.lib
等文件中的vc141
、1_64
等文字需要到C:\Program Files\PCL_1_8_1\3rdParty\Boost\lib
文件夹下进行确认后修改;vtkalglib-8.0-gd.lib
等文件中的8.0
需要到C:\Program Files\PCL_1_8_1\3rdParty\VTK\lib
文件夹下进行确认后修改。同样,这两个路径根据自己电脑的安装情况而定。
接下来说一下Release模式的配置。还是右键点击解决方案管理器
中的pcl_test
,然后选择属性
,然后在窗口最上方选择Release
,然后选择自己在下载点云库时候选择的平台。
然后按照Debug模式的配置方式依次配置,只是链接器
下的输入
中的附加依赖项
中的文件列表不相同,需要填写为下面的文件:
| |
同样需要注意版本问题。
对于报错:
经过一番搜索之后,发现是因为vtk8.10之后的版本中将vtkMapper的ImmediateModeRenderingOff()方法移除了,所以为了让pcl1.9.1代码编译通过,只需要将错误提示中对应的那一行代码注释掉即可,或者更换为更低版本的vtk也行。