前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PCL1.8.1+vs2015配置教程

PCL1.8.1+vs2015配置教程

作者头像
点云PCL博主
发布2019-09-17 15:55:48
7.5K3
发布2019-09-17 15:55:48
举报
文章被收录于专栏:点云PCL点云PCL

一、下载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交流群。

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

作者:资源组

排版:青衫依旧

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 点云PCL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档