PCL-1.11.0 在 VS 2019 上的安装配置及测试方法

in 专业 with 0 comment

pcl

费了一整天的时间终于把PCL在电脑上搞定了qwq

本以为很简单地将各种lib包和第三方应用服务导入到VS就可以大功告成,没想到按照网上的教程操作了之后每次运行测试的代码都会出现奇奇怪怪的错误。最常见的就是代码可以编译,但是在运行的过程中会抛出IOException,bad_alloc,或者直接abort。参见了GitHub之后意识到在配置的过程中为了简便把所有的库文件名都导入进了debug模式的配置文件中,实际上不同的配置文件要放进不同的模式里面。希望这篇文章可以让各位不走弯路~ 以下是详细的安装及配置流程:

安装

https://github.com/PointCloudLibrary/pcl/releases下载最新的PCL库,注意要同时下载AllInOne和pdb两个文件。

GitHub

接着安装AllInOne,注意在安装的时候要勾选上「Add PCL to the system PATH for all users」

installation-1
图片来源:https://blog.csdn.net/qq_21815981/article/details/79841683

安装位置最好在盘的根目录下,不过因为我装在了C盘所以PCL在Program Files文件夹中 (不分区党在哪里~)

installation-2
图片来源:https://blog.csdn.net/qq_21815981/article/details/79841683

点进PCL的安装路径,进入3rdPartyOpenNI2并点击唯一.msi文件安装。建议把OpenNI2的安装路径放在当前的文件夹里面,这样在之后的配置中会更加简单一些。不太清楚为什么我的电脑显示已经安装在了其他的位置,这个时候就要先卸载掉OpenNI2再去安装到这个文件夹里面。卸载的操作也可以在.smi里找到。

openni2

安装的最后一步,把pdb解压到lib文件夹中,大功告成!

欸,你是不是还没装Visual Studio 2019呢?嘿嘿,这个也得安装上,在安装的时候别忘记勾选上C++的开发包,没有这个后面的配置环节也会出现问题的。

VS

在这里下载:

https://visualstudio.microsoft.com/vs/

配置

接下来就到了配置的环节啦。首先是配置环境变量,具体的步骤就不细说啦。将以下几条路径加入到PATH中(截图里多出了几条可以不写进去):

C:Program FilesPCL 1.11.0bin
C:Program FilesPCL 1.11.03rdPartyFLANNbin
C:Program FilesPCL 1.11.03rdPartyQhullbin
C:Program FilesPCL 1.11.03rdPartyVTKbin
C:Program FilesPCL 1.11.03rdPartyBoostlib
C:Program FilesPCL 1.11.03rdPartyOpenNI2Lib

path

终于可以用VS啦。打开VS,并且新建一个项目(左上角文件->新建->项目)并且命名为test(或者任意的名字啦,这里用test举个栗子)在项目创建好之后新建一个cpp源文件(左上角文件->新建->文件)

VS-1

紧接着点击视图->解决方案资源管理器,不过这个界面可能在新建项目的时候默认打开了,在VS界面的右侧。右键点击test,打开属性,开始配置。

首先在顶部的配置区域选择Debug,平台x64。这一步千万不能搞错。

debug

点击界面左侧的「VC++目录」,在「包含目录」右侧的下拉菜单中点击「编辑...」输入添加以下几种路径(注意如果你的PCL安装路径和我的不一样的话需要做一些更改):

C:Program FilesPCL 1.11.0includepcl-1.11
C:Program FilesPCL 1.11.03rdPartyBoostincludeboost-1_73
C:Program FilesPCL 1.11.03rdPartyEigeneigen3
C:Program FilesPCL 1.11.03rdPartyFLANNinclude
C:Program FilesPCL 1.11.03rdPartyQhullinclude
C:Program FilesPCL 1.11.03rdPartyVTKincludevtk-8.2
C:Program FilesPCL 1.11.03rdPartyOpenNI2Include

配置-1

用同样的方法将以下几种路径加入到库目录中:

C:Program FilesOpenNI2Lib
C:Program FilesPCL 1.11.03rdPartyVTKlib
C:Program FilesPCL 1.11.03rdPartyQhulllib
C:Program FilesPCL 1.11.03rdPartyFLANNlib
C:Program FilesPCL 1.11.03rdPartyBoostlib
C:Program FilesPCL 1.11.0lib

点击「C/C++」目录下的「预处理器」菜单,在右侧「预处理器定义」中加入一下这些命令:

_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS
_SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING
NOMINMAX
BOOST_USE_WINDOWS_H
BOOST_ALL_NO_LIB

点击「C/C++」目录下的「所有选项」菜单,在右侧找到「SDL检查」并将属性改为「否(/sdl-)」

点击「链接器」目录下的「输入」菜单,在右侧「附加依赖项」中写入一下这些包(格式好乱哇啊啊啊啊啊啊qwq 不过直接复制粘贴就好啦):

OpenNI2.lib
vtkChartsCore-8.2-gd.lib vtkCommonColor-8.2-gd.lib
vtkCommonComputationalGeometry-8.2-gd.lib vtkCommonCore-8.2-gd.lib
vtkCommonDataModel-8.2-gd.lib vtkCommonExecutionModel-8.2-gd.lib
vtkCommonMath-8.2-gd.lib vtkCommonMisc-8.2-gd.lib
vtkCommonSystem-8.2-gd.lib vtkCommonTransforms-8.2-gd.lib
vtkDICOMParser-8.2-gd.lib vtkDomainsChemistry-8.2-gd.lib
vtkDomainsChemistryOpenGL2-8.2-gd.lib vtkdoubleconversion-8.2-gd.lib
vtkexodusII-8.2-gd.lib vtkexpat-8.2-gd.lib vtkFiltersAMR-8.2-gd.lib
vtkFiltersCore-8.2-gd.lib vtkFiltersExtraction-8.2-gd.lib
vtkFiltersFlowPaths-8.2-gd.lib vtkFiltersGeneral-8.2-gd.lib
vtkFiltersGeneric-8.2-gd.lib vtkFiltersGeometry-8.2-gd.lib
vtkFiltersHybrid-8.2-gd.lib vtkFiltersHyperTree-8.2-gd.lib
vtkFiltersImaging-8.2-gd.lib vtkFiltersModeling-8.2-gd.lib
vtkFiltersParallel-8.2-gd.lib vtkFiltersParallelImaging-8.2-gd.lib
vtkFiltersPoints-8.2-gd.lib vtkFiltersProgrammable-8.2-gd.lib
vtkFiltersSelection-8.2-gd.lib vtkFiltersSMP-8.2-gd.lib
vtkFiltersSources-8.2-gd.lib vtkFiltersStatistics-8.2-gd.lib
vtkFiltersTexture-8.2-gd.lib vtkFiltersTopology-8.2-gd.lib
vtkFiltersVerdict-8.2-gd.lib vtkfreetype-8.2-gd.lib
vtkGeovisCore-8.2-gd.lib vtkgl2ps-8.2-gd.lib vtkglew-8.2-gd.lib
vtkGUISupportMFC-8.2-gd.lib vtkhdf5-8.2-gd.lib vtkhdf5_hl-8.2-gd.lib
vtkImagingColor-8.2-gd.lib vtkImagingColor-8.2.lib
vtkImagingCore-8.2-gd.lib vtkImagingCore-8.2.lib
vtkImagingFourier-8.2-gd.lib vtkImagingFourier-8.2.lib
vtkImagingGeneral-8.2-gd.lib vtkImagingGeneral-8.2.lib
vtkImagingHybrid-8.2-gd.lib vtkImagingHybrid-8.2.lib
vtkImagingMath-8.2-gd.lib vtkImagingMath-8.2.lib
vtkImagingMorphological-8.2-gd.lib vtkImagingMorphological-8.2.lib
vtkImagingSources-8.2-gd.lib vtkImagingSources-8.2.lib
vtkImagingStatistics-8.2-gd.lib vtkImagingStatistics-8.2.lib
vtkImagingStencil-8.2-gd.lib vtkImagingStencil-8.2.lib
vtkInfovisCore-8.2-gd.lib vtkInfovisLayout-8.2-gd.lib
vtkInteractionImage-8.2-gd.lib vtkInteractionStyle-8.2-gd.lib
vtkInteractionWidgets-8.2-gd.lib vtkIOAMR-8.2-gd.lib
vtkIOAsynchronous-8.2-gd.lib vtkIOCityGML-8.2-gd.lib
vtkIOCore-8.2-gd.lib vtkIOEnSight-8.2-gd.lib vtkIOExodus-8.2-gd.lib
vtkIOExport-8.2-gd.lib vtkIOExportOpenGL2-8.2-gd.lib
vtkIOExportPDF-8.2-gd.lib vtkIOGeometry-8.2-gd.lib
vtkIOImage-8.2-gd.lib vtkIOImport-8.2-gd.lib vtkIOInfovis-8.2-gd.lib
vtkIOLegacy-8.2-gd.lib vtkIOLSDyna-8.2-gd.lib vtkIOMINC-8.2-gd.lib
vtkIOMovie-8.2-gd.lib vtkIONetCDF-8.2-gd.lib vtkIOParallel-8.2-gd.lib
vtkIOParallelXML-8.2-gd.lib vtkIOPLY-8.2-gd.lib vtkIOSegY-8.2-gd.lib
vtkIOSQL-8.2-gd.lib vtkIOTecplotTable-8.2-gd.lib
vtkIOVeraOut-8.2-gd.lib vtkIOVideo-8.2-gd.lib vtkIOXML-8.2-gd.lib
vtkIOXMLParser-8.2-gd.lib vtkjpeg-8.2-gd.lib vtkjsoncpp-8.2-gd.lib
vtklibharu-8.2-gd.lib vtklibxml2-8.2-gd.lib vtklz4-8.2-gd.lib
vtklzma-8.2-gd.lib vtkmetaio-8.2-gd.lib vtkNetCDF-8.2-gd.lib
vtkogg-8.2-gd.lib vtkParallelCore-8.2-gd.lib vtkpng-8.2-gd.lib
vtkproj-8.2-gd.lib vtkpugixml-8.2-gd.lib
vtkRenderingAnnotation-8.2-gd.lib vtkRenderingContext2D-8.2-gd.lib
vtkRenderingContextOpenGL2-8.2-gd.lib vtkRenderingCore-8.2-gd.lib
vtkRenderingExternal-8.2-gd.lib vtkRenderingFreeType-8.2-gd.lib
vtkRenderingGL2PSOpenGL2-8.2-gd.lib vtkRenderingImage-8.2-gd.lib
vtkRenderingLabel-8.2-gd.lib vtkRenderingLOD-8.2-gd.lib
vtkRenderingOpenGL2-8.2-gd.lib vtkRenderingVolume-8.2-gd.lib
vtkRenderingVolumeOpenGL2-8.2-gd.lib vtksqlite-8.2-gd.lib
vtksys-8.2-gd.lib vtktheora-8.2-gd.lib vtktiff-8.2-gd.lib
vtkverdict-8.2-gd.lib vtkViewsContext2D-8.2-gd.lib
vtkViewsCore-8.2-gd.lib vtkViewsInfovis-8.2-gd.lib vtkzlib-8.2-gd.lib
pcl_commond.lib pcl_featuresd.lib pcl_filtersd.lib pcl_iod.lib
pcl_io_plyd.lib pcl_kdtreed.lib pcl_keypointsd.lib pcl_mld.lib
pcl_octreed.lib pcl_outofcored.lib pcl_peopled.lib
pcl_recognitiond.lib pcl_registrationd.lib pcl_sample_consensusd.lib
pcl_searchd.lib pcl_segmentationd.lib pcl_stereod.lib pcl_surfaced.lib
pcl_trackingd.lib pcl_visualizationd.lib

基本上就配置完成啦!最后的最后说一下自己遇到的一个坑,在运行测试代码的时候不要忘记把测试环境换成x64的(默认x86)要不然的话VS会疯狂地报错。。嗯,就用这段代码试一下吧~

测试

首先右键点击「解决方案资源管理器」里的「test」,选中「在文件资源管理器中打开文件夹」,并且把这个文件放在打开的文件夹内:

链接:https://pan.baidu.com/s/108Wmq4t0Gx9SVLq90Bd1yw
提取码:r8za

好哒~然后在cpp的源文件中放入以下代码:

#include<iostream>
#include<pcl/io/io.h>
#include<pcl/io/pcd_io.h>
#include<pcl/io/ply_io.h>
#include<pcl/visualization/cloud_viewer.h>
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;
}

GIF演示

演示
图片来源:https://blog.csdn.net/HHT0506/article/details/104510773

是不是很炫酷!

Responses