Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)
Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0
由于鄙人毕设及读研的方向可能为三维点云,而且PCL作为开源的点云库(相当于计算机视觉里的Opencv的地位,安装可能会比Opencv麻烦点),所以我将学习PCL当做入门。刚开始安装PCL的时候我可谓是踩坑无数,希望记录下来能够对大家有所帮助~
这里非常感谢这几位博主的博客,这篇博客也是基于他们的前期工作至上:
https://cloud.tencent.com/developer/article/1507247
https://blog.youkuaiyun.com/xiaolong361/article/details/89361561#Qt5120_8
前期工作
这里主要讲Qt的安装,因为PCL包里的VTK第三方库默认是不支持Qt可视化的,如果在后期想要可视化一直复杂的点云结构的话需要安装Qt,其次VTK的编译也需要Qt的安装
- 去Qt官方下载qt安装包,这里是安装了Qt5.12.0,附上官方下载地址:http://download.qt.io/archive/qt/
- 下载完后,双击安装包选择安装目录,在选择安装组件时,一定要记得勾选MSVC组件,否则你按照完后会没有qmake.exe等可执行文件,无法进行后面VTK的编译。MSVC需要选择和你VS对应的版本例如我VS是2015:
- 后面一路傻瓜式安装即可
PCL的安装与配置
-
下载PCL1.8.1,PCL官网自从1.6后的版本都托管到了github上,附上下载地址:http://unanancyowen.com/en/pcl181,这里选择对应版本
注意:这里提供的是All-in-one版本的安装文件,以及下面的PDB文件(调试文件)都下载下来,根据自己电脑的系统位数来安装,应该一般都是64位的 -
安装配置,将下好的exe文件直接运行安装:
选择一个目录安装,这里最好保证路径没有中文和空格
这里最好选择安装到系统所有用户,安装完后会自动添加pcl的环境变量
安装过程中会弹出窗口提示安装OpenNI,将OpenNI的安装路径更改为自己选定的安装PCL的第三方库(3rdparty文件夹)的路径下即:D:\PCL1.8.1\PCL1.8.1\3rdparty\OpenNI2,然后同意安装
若出现这个警告,直接确认忽略
安装完后的目录样纸: -
把下载的PDB文件解压全部放在刚安装完PCL下的bin目录下面去
-
环境变量的设置
图示的系统环境变量是之前pcl安装时自动添加的,若没有的话可自行对照添加
现在还要做的就是,将第三方的bin文件添加到系统文件中去,如下
在系统的Path环境变量中手动添加:
%PCL_ROOT%\bin
%PCL_ROOT%\3rdParty\FLANN\bin
%PCL_ROOT%\3rdParty\Qhull\bin
%PCL_ROOT%\3rdParty\OpenNI2\Tools
%PCL_ROOT%\3rdParty\VTK\bin
在vs中配置pcl库
- 在VS中新建一个项目,并打开属性管理器 ,找到Debug|x64,新建属性页命名为PCLPropertySheet_D(命名可随意)
- 双击打开属性页,进行配置(这里的路径根据自己的安装情况填写):
①点击“VC++目录”->“包含目录”,进行编辑。
添加下列路径:(按照自己的目录来设置)
D:\PCL1.8.1\include\pcl-1.8.
D:\PCL1.8.1\3rdParty\Boost\include\boost-1_64
D:\PCL1.8.1\3rdParty\Eigen\eigen3
D:\PCL1.8.1\3rdParty\FLANN\include
D:\PCL1.8.1\3rdParty\FLANN\include\flann
D:\PCL1.8.1\3rdParty\OpenNI2\Include
D:\PCL1.8.1\3rdParty\Qhull\include
D:\PCL1.8.1\3rdParty\VTK\include\vtk-8.0
②点击“VC++目录”->“库目录”,进行编辑。
添加下列路径:(按照自己的目录来设置)
D:\PCL1.8.1\lib
D:\PCL1.8.1\3rdParty\Boost\lib
D:\PCL1.8.1\3rdParty\FLANN\lib
D:\PCL1.8.1\3rdParty\OpenNI2\Lib
D:\PCL1.8.1\3rdParty\Qhull\lib
D:\PCL1.8.1\3rdParty\VTK\lib
③点击“链接器”->“输入”->“附加依赖项”,进行编辑,添加lib文件
这里的lib文件太多,基本上是pcl安装目录下所有lib目录的lib文件:
pcl_common_debug.lib
pcl_features_debug.lib
pcl_filters_debug.lib
pcl_io_debug.lib
pcl_io_ply_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-vc140-mt-gd-1_64.lib
libboost_bzip2-vc140-mt-gd-1_64.lib
libboost_chrono-vc140-mt-gd-1_64.lib
libboost_container-vc140-mt-gd-1_64.lib
libboost_context-vc140-mt-gd-1_64.lib
libboost_coroutine-vc140-mt-gd-1_64.lib
libboost_date_time-vc140-mt-gd-1_64.lib
libboost_exception-vc140-mt-gd-1_64.lib
libboost_fiber-vc140-mt-gd-1_64.lib
libboost_filesystem-vc140-mt-gd-1_64.lib
libboost_graph_parallel-vc140-mt-gd-1_64.lib
libboost_graph-vc140-mt-gd-1_64.lib
libboost_iostreams-vc140-mt-gd-1_64.lib
libboost_locale-vc140-mt-gd-1_64.lib
libboost_log-vc140-mt-gd-1_64.lib
libboost_log_setup-vc140-mt-gd-1_64.lib
libboost_math_c99-vc140-mt-gd-1_64.lib
libboost_math_c99f-vc140-mt-gd-1_64.lib
libboost_math_c99l-vc140-mt-gd-1_64.lib
libboost_math_tr1-vc140-mt-gd-1_64.lib
libboost_math_tr1f-vc140-mt-gd-1_64.lib
libboost_math_tr1l-vc140-mt-gd-1_64.lib
libboost_mpi-vc140-mt-gd-1_64.lib
libboost_numpy3-vc140-mt-gd-1_64.lib
libboost_numpy-vc140-mt-gd-1_64.lib
libboost_prg_exec_monitor-vc140-mt-gd-1_64.lib
libboost_program_options-vc140-mt-gd-1_64.lib
libboost_python3-vc140-mt-gd-1_64.lib
libboost_python-vc140-mt-gd-1_64.lib
libboost_random-vc140-mt-gd-1_64.lib
libboost_regex-vc140-mt-gd-1_64.lib
libboost_serialization-vc140-mt-gd-1_64.lib
libboost_signals-vc140-mt-gd-1_64.lib
libboost_system-vc140-mt-gd-1_64.lib
libboost_test_exec_monitor-vc140-mt-gd-1_64.lib
libboost_thread-vc140-mt-gd-1_64.lib
libboost_timer-vc140-mt-gd-1_64.lib
libboost_type_erasure-vc140-mt-gd-1_64.lib
libboost_unit_test_framework-vc140-mt-gd-1_64.lib
libboost_wave-vc140-mt-gd-1_64.lib
libboost_wserialization-vc140-mt-gd-1_64.lib
libboost_zlib-vc140-mt-gd-1_64.lib
vtkzlib-8.0-gd.lib
vtkViewsContext2D-8.0-gd.lib
vtkhdf5_hl-8.0-gd.lib
vtkFiltersProgrammable-8.0-gd.lib
vtkIOMovie-8.0-gd.lib
vtkexpat-8.0-gd.lib
vtkRenderingLOD-8.0-gd.lib
vtkIOPLY-8.0-gd.lib
vtkpng-8.0-gd.lib
vtkIOVideo-8.0-gd.lib
vtkRenderingImage-8.0-gd.lib
vtkFiltersVerdict-8.0-gd.lib
vtkjpeg-8.0-gd.lib
vtkInteractionImage-8.0-gd.lib
vtkverdict-8.0-gd.lib
vtkoggtheora-8.0-gd.lib
vtkImagingStatistics-8.0-gd.lib
vtkCommonSystem-8.0-gd.lib
vtkFiltersParallelImaging-8.0-gd.lib
vtkFiltersTexture-8.0-gd.lib
vtkCommonMisc-8.0-gd.lib
vtkCommonMath-8.0-gd.lib
vtkFiltersSelection-8.0-gd.lib
vtkImagingFourier-8.0-gd.lib
vtkIOXMLParser-8.0-gd.lib
vtkproj4-8.0-gd.lib
vtkalglib-8.0-gd.lib
vtktiff-8.0-gd.lib
vtksqlite-8.0-gd.lib
vtkImagingSources-8.0-gd.lib
vtkCommonTransforms-8.0-gd.lib
vtkImagingMath-8.0-gd.lib
vtkFiltersGeneric-8.0-gd.lib
vtkexoIIc-8.0-gd.lib
vtkfreetype-8.0-gd.lib
vtkImagingColor-8.0-gd.lib
vtknetcdf_c+±gd.lib
vtkNetCDF-8.0-gd.lib
vtkFiltersImaging-8.0-gd.lib
vtkFiltersHyperTree-8.0-gd.lib
vtkImagingMorphological-8.0-gd.lib
vtkImagingStencil-8.0-gd.lib
vtkRenderingFreeType-8.0-gd.lib
vtkCommonColor-8.0-gd.lib
vtkjsoncpp-8.0-gd.lib
vtkRenderingContext2D-8.0-gd.lib
vtkFiltersAMR-8.0-gd.lib
vtkRenderingContextOpenGL-8.0-gd.lib
vtkIOParallelXML-8.0-gd.lib
vtkViewsCore-8.0-gd.lib
vtkImagingHybrid-8.0-gd.lib
vtkIOExport-8.0-gd.lib
vtkRenderingVolumeOpenGL-8.0-gd.lib
vtkIOImport-8.0-gd.lib
vtkDomainsChemistry-8.0-gd.lib
vtkInteractionStyle-8.0-gd.lib
vtkCommonComputationalGeometry-8.0-gd.lib
vtkDICOMParser-8.0-gd.lib
vtklibxml2-8.0-gd.lib
vtkIOMINC-8.0-gd.lib
vtkIOSQL-8.0-gd.lib
vtkFiltersModeling-8.0-gd.lib
vtkParallelCore-8.0-gd.lib
vtkIOAMR-8.0-gd.lib
vtkGeovisCore-8.0-gd.lib
vtksys-8.0-gd.lib
vtkIOEnSight-8.0-gd.lib
vtkImagingGeneral-8.0-gd.lib
vtkFiltersFlowPaths-8.0-gd.lib
vtkIOLSDyna-8.0-gd.lib
vtkFiltersSMP-8.0-gd.lib
vtkIOParallel-8.0-gd.lib
vtkFiltersGeometry-8.0-gd.lib
vtkInfovisLayout-8.0-gd.lib
vtkIOCore-8.0-gd.lib
vtkFiltersSources-8.0-gd.lib
vtkIOLegacy-8.0-gd.lib
vtkFiltersHybrid-8.0-gd.lib
vtkIONetCDF-8.0-gd.lib
vtkFiltersExtraction-8.0-gd.lib
vtkFiltersParallel-8.0-gd.lib
vtkRenderingLabel-8.0-gd.lib
vtkIOInfovis-8.0-gd.lib
vtkRenderingAnnotation-8.0-gd.lib
vtkImagingCore-8.0-gd.lib
vtkCommonExecutionModel-8.0-gd.lib
vtkhdf5-8.0-gd.lib
vtkViewsInfovis-8.0-gd.lib
vtkIOGeometry-8.0-gd.lib
vtkmetaio-8.0-gd.lib
vtkIOImage-8.0-gd.lib
vtkIOXML-8.0-gd.lib
vtkIOExodus-8.0-gd.lib
vtkRenderingVolume-8.0-gd.lib
vtkChartsCore-8.0-gd.lib
vtkFiltersStatistics-8.0-gd.lib
vtkInfovisCore-8.0-gd.lib
vtkRenderingCore-8.0-gd.lib
vtkInteractionWidgets-8.0-gd.lib
vtkRenderingOpenGL-8.0-gd.lib
vtkFiltersGeneral-8.0-gd.lib
vtkFiltersCore-8.0-gd.lib
vtkCommonDataModel-8.0-gd.lib
vtkCommonCore-8.0-gd.lib
flann_cpp_s-gd.lib
qhullstatic_d.lib
OpenNI2.lib - 同理在release下重复以上三个步骤,需要注意的是添加的lib是release下的lib
- 配置完成,测试配置是否正确
代码如下:
#include<pcl/visualization/cloud_viewer.h>
#include<iostream>//标准C++库中的输入输出类相关头文件。
#include<pcl/io/io.h>
#include<pcl/io/pcd_io.h>//pcd 读写类相关的头文件。
#include<pcl/io/ply_io.h>
#include<pcl/point_types.h> //PCL中支持的点类型头文件。
int user_data;
using std::cout;
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
viewer.setBackgroundColor(1.0, 0.5, 1.0); //设置背景颜色
}
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
char strfilepath[256] = "rabbit.pcd";
if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)) {
cout << "error input!" << endl;
return -1;
}
cout << cloud->points.size() << endl;
pcl::visualization::CloudViewer viewer("Cloud Viewer"); //创建viewer对象
viewer.showCloud(cloud);
viewer.runOnVisualizationThreadOnce(viewerOneOff);
system("pause");
return 0;
}
当出现兔子状的点云显示时,说明配置成功
①编译的时候记得将编译器变为x64的环境下运行,然后估计会报这样的错误:
error C4996: ‘pcl::SAC_SAMPLE_SIZE’: This map is deprecated and is kept only to prevent breaking existing user…
解决方式:属性"->“C/C++”->“SDL检查”:改为否(/sdl)
②为了防止弹出很多的warning,加入预处理器
在属性目录"C/C++ "– >“预处理器”–>“预处理器定义” 加入:
_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS
PCL_NO_PRECOMPILE
③在Debug下编译会出现大量的如下warning(Release下没有):
warning LNK4099: 未找到 PDB“.pdb”正在链接对象,如同没有调试信息一样
解决方法:“视图”->“解决方案资源管理器”->“属性”->“链接器"->“调试”,在右侧的“生成调试信息”改为“否”,确定即可。
具体原因涉及到release和debug的区别,以及PDB文件,具体可百度了解。
④提取文件夹中.lib文件名到文本中 分别粘贴复制静态链接库名到文本甚是麻烦,故通过批处理来完成
使用cmake编译vtk
cmake我的版本3.11.0
据说PCL1.8.1对应的VTK版本为8.0.0,所以先下载vtk8.0.0,附上地址:https://gitlab.kitware.com/vtk/vtk/tree/v8.0.0,将下载好的vtk解压放到一个目录下,然后将PCL的3rdParty下的VTK目录清空(也可以把里面的内容做下备份),保证3rdParty目录下有一个空的VTK目录
-
进入解压后的vtk8.0.0,新建一个名为build的空目录
-
打开cmake,在source code路径选择要编译的vtk8.0.0目录,build路径选择刚才新建的build目录路径
-
点击config后弹出的窗口,设置如下:
注意:generator选择对应版本的VS以及平台集
-
点击Add Entry,添加CMAKE_DEBUG_POSTFIX,类型为“STRING”,其值设置为"-gd"。用来区分编译生成debug与release版本下的dll和lib文件,不然的话创建安装文件的时候debug与release版本,名字相同相互覆盖。
-
选择完毕后,会进行较长时间的配置,然后会出现一些红色的配置,此时需要手动配置,相关说明如下:
①勾选已有的“BUILD_SHARED_LIBIRARES”和“VTK_GROUP_QT”,勾选之后分别表示动态编译VTK以及给VTK添加Qt支持。
②取消BUILD_EXAMPLES和BUILD_TEST的勾,貌似勾上后再用vs编译cmake编译后的vtk时会因为网络问题(可能需要科学上网)出错,不建议勾选
③将“CMAKE_INSTALL_PREFIX”设置为之前我们清空后的VTK目录,编译完后会生成include、lib、bin等目录
④VTK_RENDERING_BACKEND选项,之前我选择OpenGL2的时候,在后面显示点云法向量等可视化操作都会触发一个0x00007FFADF5FC201 (vtkRenderingOpenGL2-8.0.dll)的异常,然后重新cmake编译时选择OpenGL后就没出现了,所以如果出现类似这种情况的话可以尝试换个cmake下的OpenGL版本选项编译 -
接着继续config配置,然后又会出现红色的错误:
这里是要配置qt的qmake路径以及qt的版本,可以根据图示进行修改,然后继续config -
config后仍出现红色,还得继续修改,这里需要修改qt相关的路径,如图所示做相应的修改即可
-
config直到没有红色的条项出现后,点击generate进行生成
生成完毕!
使用VS编译Cmake编译后的VTK
-
用管理员方式打开VS2015(一定管理员方式打开),然后在VS里打开在刚才cmake编译后build目录下的.vln文件
打开如下所示:
-
选择解决方案配置为debug,注意此时编译的结果是debug版本的相关文件
-
右键ALL_BUILD—>>重新生成(时间比较久,大约半个钟)
-
右键INSTALL—>>生成
-
生成结束后你会发现VTK目录下出现了这些目录
为了生成且不覆盖这些文件,我们将将debug版本生成的文件放在VTK目录下新建的debug目录、如图所示:
-
同理上述步骤生成release版本的文件,放在VTK下的release目录
-
由于更新了vtk库,所以需要分别更新配置vs项目中的属性管理器的属性页(debug版本和release版本)设置:
①VC+±>目录的包含目录和库目录
②链接器->输入->附加依赖项中的vtk开头的库lib文件需要全部修改为对应新生成lib目录(debug版本和release版本相应设置)下的所有lib文件
这里教大家一个小方法可以快速将当前目录下所有lib文件的名称保存到一个txt文件中:
打开cmd,cd到存放lib文件的目录中,输入指令:dir *.lib /b >LIBLIST.TXT,此时LIBLIST.TXT会保存所有的lib文件 -
此时vs的配置全部完成,但由于我们的vtk库区分了debug和release版本,所以一开始pcl的环境变量“%PCL_ROOT%\3rdParty\VTK\bin”需要修改为正确的debug或者是release下的bin目录(因为这里环境变量只能指定一个debug或者release版本,所以我们需要使用具体哪个版本的时候再具体设置,因为我一直使用release版本,所以我设置为%PCL_ROOT%\3rdParty\VTK\release\bin)
大功告成啦
Troubleshoting
-
出现vtk错误“no override found for vtkActor”,解决方案:
头文件添加:
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle); -
C4996 ‘fopen’: This function or variable may be unsafe. 解决方案:
项目 ->属性 -> c/c++ -> 预处理器 -> 点击预处理器定义,编辑,加入_CRT_SECURE_NO_WARNINGS,即可 -
出现类似于:错误 C1083 无法打开包括文件: “boost/shared_ptr.hpp”: No such file or directory”的解决办法,检查 属性页下VC++包含目录的路径是否正确
-
出现:
解决方案:检查环境变量vtk库目录下的bin目录路径是否正确