PCL1.8.1+vs2015配置教程

一、下载PCL安装包

下载路径:http://unanancyowen.com/en/pcl181 (这个并不是官网,官网是这个:http://pointclouds.org/)

先看下进去下载链接我们会看到什么东西,对PCL有个基本的认识:

注意,点击这里的Source Code和Change List会跳转到GitHub去,因为PCL官网从1.5/1.6左右的版本就不在官网上托管了,最新的版本全部放在了GitHub上了

1、下面是PCL常见的几大模块:

2、这里介绍了开发环境:

注意这里的一个注释1,看看是怎么介绍的:

说的意思就是说PCL的一些主要的三方的库有哪些:Qt(UI显示)、CUDA(GPU开发)、GLUT和GLEW(都是OpenGL的东西)

3、接着往下面看

Required:配置需要的第三方支持,分别有Boost、Eigen、FLANN、VTK等

Optional:配置可选第三方支持,有OpenNI/OpenNI2,建议安装的时候都装上去

4、下载安装方式

注意:这里提供的是All-in-one版本的安装文件,以及下面的PDB文件(调试文件)都下载下来,根据自己电脑的系统位数来安装,应该一般都是64位的

5、这里还有一个配置环境

这里可以不用管,就类似于安装配置Opencv的时候需要在系统环境变量中配置一下的那个一样,我们等下安装的时候勾选了东西就可以自己在环境变量中配置了

二、安装配置

下载好的文件,点击那个exe的文件直接安装,注意在下面这步按照如下选择:

修改安装路径,习惯性的安装在D盘下:(这里有个问题啊,就是据说cmake去编译PCL的时候会默认去c盘下面找,所以到时候cmake的时候记得把安装路径改下注意把路径改下)

安装过程中会弹出窗口提示安装OpenNI,将OpenNI的安装路径更改为自己选定的安装PCL的第三方库(3rdparty文件夹)的路径下即:D:\PCL1.8.1\PCL1.8.1\3rdparty\OpenNI2,然后同意安装PrimerSense

下面的这个警告忽略:提示什么路径太长

安装完成:

安装完成后,安装目录下面的几个文件是这样的:

然后把PDB文件解压放在bin目录下面去

到这一步,PCL的安装算是完成了

顺便说下第三方文件夹下有哪些文件啊:一共六个文件,就是上面提到过的六个文件

其中的VTK是一个可视化工具包,就是显示点云用的,一般会和Qt结合一起用,但是这里安装的VTK是还没有和QT一起编译的,所以这两个还不能结合一起用的,需要用CMake编译工具编译,这就是为什么安装完成了还要用make工具去编译的原因

(注意这里的路径中需要把空格去掉,我这里的截图是没有去空格的,空格一定要去掉)

三、环境变量配置

一般来讲,安装第三方软件是不可避免要去配置环境变量的,opencv如此,PCL亦是如此,安装的Qt也是如此,下面就如何配置环境变量说下:

在系统的环境变量里面可以看到,如下:

这四个就是我们在上面的安装过程中点击的选项自动添加的

现在还要做的就是,将第三方的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

搞完前面的这三步,PCL的安装就基本完成了,下面就是在VS中的配置了

四、pcl在VS中的配置

VS2015新建项目,这里命名为PCLPropertySheet_D,表示Debug下的配置

1、打开属性管理器,找到Debug|x64,右键新建属性页,然后输入名称PCLPropertySheet_D,然后点击添加,如下

2、双击打开该属性页,进行配置

①点击“VC++目录”->“包含目录”,进行编辑。

添加下列路径:(按照自己的目录来设置)

D:\PCL1.8.1\PCL1.8.1\include\pcl-1.8.

D:\PCL1.8.1\PCL1.8.1\3rdParty\Boost\include\boost-1_64

D:\PCL1.8.1\PCL1.8.1\3rdParty\Eigen\eigen3

D:\PCL1.8.1\PCL1.8.1\3rdParty\FLANN\include

D:\PCL1.8.1\PCL1.8.1\3rdParty\FLANN\include\flann

D:\PCL1.8.1\PCL1.8.1\3rdParty\OpenNI2\Include

D:\PCL1.8.1\PCL1.8.1\3rdParty\Qhull\include

D:\PCL1.8.1\PCL1.8.1\3rdParty\VTK\include\vtk-8.0

②点击“VC++目录”->“库目录”,进行编辑。

添加下列路径:(按照自己的目录来设置)

D:\PCL1.8.1\PCL1.8.1\lib

D:\PCL1.8.1\PCL1.8.1\3rdParty\Boost\lib

D:\PCL1.8.1\PCL1.8.1\3rdParty\FLANN\lib

D:\PCL1.8.1\PCL1.8.1\3rdParty\OpenNI2\Lib

D:\PCL1.8.1\PCL1.8.1\3rdParty\Qhull\lib

D:\PCL1.8.1\PCL1.8.1\3rdParty\VTK\lib

③点击“链接器”->“输入”->“附加依赖项”,进行编辑,添加lib文件。

这里添加的lib文件太多了,建立了txt文件保存了,见链接,输入里面的Debug的lib文件即可

3、同理在release下建立属性页,如下

同理如上,上面的①②③步都配置,注意的是第三步要加入release下的lib文件,见链接

这里整个配置就完成了,检验下配置是否正确:

程序1:

#include <iostream>

#include <pcl/io/pcd_io.h>

#include <pcl/point_types.h>

#include <pcl/ModelCoefficients.h>

#include <pcl/filters/project_inliers.h>

int main(int argc, char** argv)

{

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_projected(new pcl::PointCloud<pcl::PointXYZ>);

cloud->width = 5;

cloud->height = 1;

cloud->points.resize(cloud->width * cloud->height);

for (size_t i = 0; i < cloud->points.size(); ++i)

{

cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);

cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);

cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);

}

std::cerr << "Cloud before projection: " << std::endl;

for (size_t i = 0; i < cloud->points.size(); ++i)

std::cerr << " " << cloud->points[i].x << " " <<

cloud->points[i].y << " " << cloud->points[i].z << std::endl;

// Create a set of planar coefficients with X=Y=0,Z=1

pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());

coefficients->values.resize(4);

coefficients->values[0] = coefficients->values[1] = 0;

coefficients->values[2] = 1.0;

coefficients->values[3] = 0;

// Create the filtering object

pcl::ProjectInliers<pcl::PointXYZ> proj;

proj.setModelType(pcl::SACMODEL_PLANE);

proj.setInputCloud(cloud);

proj.setModelCoefficients(coefficients);

proj.filter(*cloud_projected);

std::cerr << "Cloud after projection: " << std::endl;

for (size_t i = 0; i < cloud_projected->points.size(); ++i)

std::cerr << " " << cloud_projected->points[i].x << " " <<

cloud_projected->points[i].y << " " << cloud_projected->points[i].z << std::endl;

system("pause");

return (0);

}

程序2

#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文件名到文本中 分别粘贴复制静态链接库名到文本甚是麻烦,故通过批处理来完成

例如要获取目录中D:\PCL 1.8.1\3rdParty\VTK\lib下的所有静态链接库文件名并存储至文本.txt,方法如下:

1、win+r

2、输入:cmd回车

3、输入:cd /d D:\PCL 1.8.1\3rdParty\VTK\lib 回车

4、输入:dir /b *.lib *>0.txt 回车

这样在Debug/Rease X64下的属性配置信息就保存在了下面这两个文件了,然后下次新建其他工程的时候加载这两个文件即可

编译报错:

五、用CMake编译下载的PCL中第三方库VTK的源码

目的:编译后就可以适应Qt和VTK的结合

好处:CMake有个好处就是编译中如果前期的配置出现了问题,导致编译出现问题,直接将编译生成的文件夹删掉,重新编译,很方便,就是耗时罢了

给vtk-v8.0.0找个位置放着:如下

编译VTK,因为PCL自带的VTK是不支持Qt的可视化的,必须自己编译(先把按照上面安装后的安装路径下的VTK文件清空,但是并不要删掉VTK这个文件夹,后面还有用的),网上下载VTK8.0版本,只能是这个,因为对应的是PCL1.8.1版本的库,用CMake编译,如下:

(这里注意下,在vtk-v8.0.0下面建立文件夹build是放编译之后的文件的,编译之后的debug和release都是放在这里面的,然后得到的dll的文件名是一样的,想要得到不同名字的dll文件,就得添加其他额外的路径,这里不做说明)

1、选择编译的原路径和编译之后的路径,如图

2、选择VS的版本 这里是vs2015

3、选择编译的平台集 64位的 X64

然后开始点击Configure开始编译,第一次编译时间会比较长,编译完之后需要勾选下面的选项,然后再次编译

解释在下面

相关的参数含义解释:

1、CMAKE_CONFIGURATION_TYPES表示让vtk的lib最后分为debug版本跟release版本。Debug版本带-gd。Release版本不带-gd,方便区分.

2.勾选BUILD_SHARED_LIBS,这样最后生成的vtk才会有dll跟lib

3.CMAKE_INSTALL_PREFIX设置为你清空的VTK文件夹,以便放你编译完只有需要得到的几个include、lib、bin文件夹等

注意这里最终得到的文件虽然和build得到的

4.勾选VTK_Group_Qt,这样以后方便在qt里面使用

5.修改Qt5_DIR路径为PATH=D:/Qt/Qt5.12.0/5.12.0/msvc2017_64/lib/cmake/Qt5

6.修改VTK_QT_VERSION:STRING=5,使用Qt5修改相应版本号

7.如出现qmake路径则修改QT_QMAKE_EXECUTABLE:FILEPATH=D:/Qt/Qt5.12.0/5.12.0/msvc2017_64/bin/qmake.exe

编译的时候可能会报错,是因为我的QT版本没有更改过来,如下图,更改Qt版本为5,路径选择安装的目录

这里注意一个细节位置:

上图中的Qt5_dir设置的路径和前面的那个路径是不一样的,注意在Cmake的时候看清楚Name的参数是

什么

报错没找到合适的版本,是因为之前VTK_QT_VERSION那里填的是4,所以要改为5,然后再次编译

编译完成后,看看最终的编译结果是怎么样的,如下图:

再次点击按钮Configuring编译,编译多次直到上面的红色条没有,

然后就是点击生成按钮Generate,如下

六、VS去编译CMake编译的VTK

目的:得到下面这两个文件

首先用管理员方式打开VS2015(一定管理员方式打开),然后找到如下的路径,打开里面的VTK.sln

打开如下:

分别在Debug和Release下面完成下面的动作:(注意这里需要在X64下面)

1、右键ALL_BUILD--->>重新生成(时间比较久)

2、右键INSTALL--->>生成

生成完成后,可以看下本地文件路径下的VTK文件夹生成的东西:

注意:如果编译的debug版本,那么上图生成的就是重新编译的debug的版本的VTK;如果编译的是release版本,那么上图生成的就是重新编译的

release版本的VTK,其实这个和build(build文件夹下只会有bin文件和lib包文件,不会有include文件)下面的bin文件的.dll以及lib文件的.lib文件是一样的,为了统一下我们将两次生成的版本分别建立文件夹放到对应的位置,如下:

这样在vs里面配置的时候就不用去包含build文件夹下的lib文件夹和bin文件夹了,直接和其他的几个三方库统一即可

3、然后再release模式下再次去执行上面两步,得到release的dll和lib

PS:非常重要

VS2015的编译结果包括4个部分。

1. include 不区分release和debug版本

2. lib 不区分版本

3. dll 根据输入配置选择debug和release版本)

4. plugin dll 只有release版本可用)

这4个编译结果被放在2个位置。

.h和.lib文件存放在D:\PCL1.8.1\PCL1.8.1\3rdParty\VTK目录。D:\PCL1.8.1\PCL1.8.1\3rdParty\VTK下的dll文件请不要使用,因为没有区分release和debug。

(这里统一下,lib文件就用D:\PCL1.8.1\PCL1.8.1\3rdParty\VTK\lib目录下的lib文件,全部是VTK的lib文件,与其他的三方库无关的)

得到的方式如下:

.dll文件被放在如下位置:(可以看到有Debug和Release)

那我们的lib文件和dll文件分别在如下路径:

小技巧:

在lib文件夹下新建一个文本文档,把下面的语句放进去,保存,改后缀名为 bat,双击,看看是不是多了一个 LIBLIST.txt 文件,

把里面的内容全复制,拷贝到附加依赖项中。

DIR *.lib /B >LIBLIST.TXT

但有一点要提醒大家:只需要将Release版本中QVTKWidgetPlugin.dll 和 QVTKWidgetPlugin.lib放在designer文件夹下就可以了,QVTK.dll不需要放入该文件夹下,否则会出现qwidget: must construct a qapplication before a qpaintde 错误,因为Release与Debug中DLL混合在一起。

目前微信交流群不断壮大,由于人数太多,目前有两个群,为了鼓励大家分享,我们希望大家能在学习的同时积极分享,将您的问题或者小总结投稿发到群主邮箱主邮箱dianyunpcl@163.com。

以上内容如有错误或者需要补充的,请留言!同时欢迎大家关注微信公众号,积极分享投稿,或者加入3D视觉微信群或QQ交流群。

原创不易,转载请联系群主,注明出处。

作者:资源组

排版:青衫依旧

原文发布于微信公众号 - 点云PCL(dianyunPCL)

原文发表时间:2019-09-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券