一、下载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交流群。
原创不易,转载请联系群主,注明出处。
作者:资源组
排版:青衫依旧