Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)

Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)

  • Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0
    • 前期工作
    • PCL的安装与配置
    • 在vs中配置pcl库
    • 使用cmake编译vtk
    • 使用VS编译Cmake编译后的VTK
    • Troubleshoting

Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0

由于鄙人毕设及读研的方向可能为三维点云,而且PCL作为开源的点云库(相当于计算机视觉里的Opencv的地位,安装可能会比Opencv麻烦点),所以我将学习PCL当做入门。刚开始安装PCL的时候我可谓是踩坑无数,希望记录下来能够对大家有所帮助~

这里非常感谢这几位博主的博客,这篇博客也是基于他们的前期工作至上:
https://cloud.tencent.com/developer/article/1507247
https://blog.csdn.net/xiaolong361/article/details/89361561#Qt5120_8

前期工作

这里主要讲Qt的安装,因为PCL包里的VTK第三方库默认是不支持Qt可视化的,如果在后期想要可视化一直复杂的点云结构的话需要安装Qt,其次VTK的编译也需要Qt的安装

  1. 去Qt官方下载qt安装包,这里是安装了Qt5.12.0,附上官方下载地址:http://download.qt.io/archive/qt/
  2. 下载完后,双击安装包选择安装目录,在选择安装组件时,一定要记得勾选MSVC组件,否则你按照完后会没有qmake.exe等可执行文件,无法进行后面VTK的编译。MSVC需要选择和你VS对应的版本例如我VS是2015:
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第1张图片
  3. 后面一路傻瓜式安装即可

PCL的安装与配置

  1. 下载PCL1.8.1,PCL官网自从1.6后的版本都托管到了github上,附上下载地址:http://unanancyowen.com/en/pcl181,这里选择对应版本
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第2张图片
    注意:这里提供的是All-in-one版本的安装文件,以及下面的PDB文件(调试文件)都下载下来,根据自己电脑的系统位数来安装,应该一般都是64位的

  2. 安装配置,将下好的exe文件直接运行安装:
    选择一个目录安装,这里最好保证路径没有中文和空格
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第3张图片
    这里最好选择安装到系统所有用户,安装完后会自动添加pcl的环境变量
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第4张图片
    安装过程中会弹出窗口提示安装OpenNI,将OpenNI的安装路径更改为自己选定的安装PCL的第三方库(3rdparty文件夹)的路径下即:D:\PCL1.8.1\PCL1.8.1\3rdparty\OpenNI2,然后同意安装
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第5张图片
    若出现这个警告,直接确认忽略
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第6张图片
    安装完后的目录样纸:Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第7张图片

  3. 把下载的PDB文件解压全部放在刚安装完PCL下的bin目录下面去

  4. 环境变量的设置
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第8张图片
    图示的系统环境变量是之前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库

  1. 在VS中新建一个项目,并打开属性管理器 ,找到Debug|x64,新建属性页命名为PCLPropertySheet_D(命名可随意)
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第9张图片
  2. 双击打开属性页,进行配置(这里的路径根据自己的安装情况填写):
    ①点击“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
  3. 同理在release下重复以上三个步骤,需要注意的是添加的lib是release下的lib
  4. 配置完成,测试配置是否正确
    代码如下:
#include
#include//标准C++库中的输入输出类相关头文件。
#include
#include//pcd 读写类相关的头文件。
#include
#include //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::Ptr cloud(new pcl::PointCloud);
	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;
}

当出现兔子状的点云显示时,说明配置成功
Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第10张图片

①编译的时候记得将编译器变为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目录

  1. 进入解压后的vtk8.0.0,新建一个名为build的空目录

  2. 打开cmake,在source code路径选择要编译的vtk8.0.0目录,build路径选择刚才新建的build目录路径
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第11张图片

  3. 点击config后弹出的窗口,设置如下:
    注意:generator选择对应版本的VS以及平台集
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第12张图片

  4. 点击Add Entry,添加CMAKE_DEBUG_POSTFIX,类型为“STRING”,其值设置为"-gd"。用来区分编译生成debug与release版本下的dll和lib文件,不然的话创建安装文件的时候debug与release版本,名字相同相互覆盖。
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第13张图片

  5. 选择完毕后,会进行较长时间的配置,然后会出现一些红色的配置,此时需要手动配置,相关说明如下:
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第14张图片
    ①勾选已有的“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版本选项编译

  6. 接着继续config配置,然后又会出现红色的错误:
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第15张图片
    这里是要配置qt的qmake路径以及qt的版本,可以根据图示进行修改,然后继续config

  7. config后仍出现红色,还得继续修改,这里需要修改qt相关的路径,如图所示做相应的修改即可
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第16张图片

  8. config直到没有红色的条项出现后,点击generate进行生成

Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第17张图片
生成完毕!

使用VS编译Cmake编译后的VTK

  1. 用管理员方式打开VS2015(一定管理员方式打开),然后在VS里打开在刚才cmake编译后build目录下的.vln文件
    打开如下所示:
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第18张图片

  2. 选择解决方案配置为debug,注意此时编译的结果是debug版本的相关文件

  3. 右键ALL_BUILD—>>重新生成(时间比较久,大约半个钟)
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第19张图片

  4. 右键INSTALL—>>生成
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第20张图片

  5. 生成结束后你会发现VTK目录下出现了这些目录
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第21张图片
    为了生成且不覆盖这些文件,我们将将debug版本生成的文件放在VTK目录下新建的debug目录、如图所示:
    Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第22张图片

  6. 同理上述步骤生成release版本的文件,放在VTK下的release目录

  7. 由于更新了vtk库,所以需要分别更新配置vs项目中的属性管理器的属性页(debug版本和release版本)设置:
    ①VC+±>目录的包含目录和库目录
    ②链接器->输入->附加依赖项中的vtk开头的库lib文件需要全部修改为对应新生成lib目录(debug版本和release版本相应设置)下的所有lib文件
    这里教大家一个小方法可以快速将当前目录下所有lib文件的名称保存到一个txt文件中:
    打开cmd,cd到存放lib文件的目录中,输入指令:dir *.lib /b >LIBLIST.TXT,此时LIBLIST.TXT会保存所有的lib文件

  8. 此时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
    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++包含目录的路径是否正确

  • 出现:Win10+VS2015环境下安装编译PCL1.8.1和VTK8.0.0(踩坑大全)_第23张图片
    解决方案:检查环境变量vtk库目录下的bin目录路径是否正确

你可能感兴趣的:(PCL)