1 PCL的安装
编译环境是vs2019 professional + win10
1.1 下载。
https://github.com/PointCloudLibrary/pcl/releases
下载这两个文件。
既然要编译源代码,为何又要下载他的AllInOne的二进制版本呢?这是因为PCL-1.12.0-AllInOne-msvc2019-win64.exe安装以后,他可以把附带的一堆第三方的库安装进去,我们后面要编译PCL源代码的时候需要这些库。
1.2 先安装整个包
PCL-1.12.0-AllInOne-msvc2019-win64.exe
这个包里面把第三方的库都搞好了,我们就不必在到处找库了。
我的安装的目录是在:
E:\project\camera\project\PCL\bin
当然你可以安装在其他目录
1.3 再安装openni:
.\3rdParty\OpenNI2\OpenNI-Windows-x64-2.2.msi
注意修改安装目录到当前目录,别默认安装目录,一会儿找不到他在哪里了
1.4 寻找缺失的dll
然后E:\project\camera\project\PCL\bin\bin下面随便运行几个exe,发现缺库dll,
比如缺vtk的各种dll,那就到E:\project\camera\project\PCL\bin\3rdParty\VTK目录下面
搜索所有的dll,将其拷贝到E:\project\camera\project\PCL\bin\bin
Openni的库也是类似,把openni目录下的所有的dll也拷贝到E:\project\camera\project\PCL\bin\bin下面。
在E:\project\camera\project\PCL\bin\3rdParty下面可以看到很多第三方的库。
把缺失的dll拷贝到E:\project\camera\project\PCL\bin之后,把这个目录下的各种exe运行一下,查看是否dll不再缺失。
1.5 写个例子eigen的例子测试一下
#include <iostream>
#include "Dense"
using namespace std;
using namespace Eigen;
int main()
{
MatrixXd test = MatrixXd::Zero(10, 10);
cout << test << endl;
}
Vs2019中include目录中添加E:\project\camera\project\PCL\bin\3rdParty\Eigen\eigen3\Eigen
运行通过
1.6 写个例子 pcl测试安装好的库
首先打开vs2019 生成一个控制台程序。
把当前代码替换进去:
#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;
#include "E:\project\camera\project\PCL\bin\lib.h"
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] = "E:\\project\\camera\\project\\PCL\\bin\\bin\\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;
}
注意我写的都是绝对路径,你要把pcd文件换成你自己的路径。
1.6.1 把_CRT_SECURE_NO_WARNINGS添加到
1.6.2 把各种include添加进入
E:\project\camera\project\PCL\bin\3rdParty\Boost\include\boost-1_76;
E:\project\camera\project\PCL\bin\3rdParty\Eigen\eigen3;
E:\project\camera\project\PCL\bin\3rdParty\VTK\include\vtk-9.0;
1.6.3 lib文件的添加
使用python 自动搜索所有的lib文件,生成一个lib.h文件,这个python代码为:
import os
from shutil import copyfile
import json
import time
from datetime import datetime
extfilenamelist = [".lib"]
libfile = open("lib.h", "w")
srcpath = os.getcwd();
index=0
for root,dirs,files in os.walk(srcpath):
for file in files:
index+=1
print("scanning "+str(index)+"\r",end="")
extfilename = os.path.splitext(file)[-1]
extfilename = extfilename.lower()
if extfilename in extfilenamelist:
file1=os.path.join(root,file)
file2= file1.replace('\\','/')
libfile.write("#pragma comment(lib,"+"\""+file2+"\")"+"\n")
libfile.close()
把这个python文件命名为searchlib.py,把这个文件放在E:/project/camera/project/PCL/bin下面,
运行它就会在当前目录下生成一个lib.h
这个lib.h 里面包含了当前目录及其子目录下所有的.lib文件。这样就避免了在vs2019中添加无数个lib文件的痛苦。
如果你不会写python就直接抄袭。但是要先安装python,我推荐你安装anaconda。
这个lib.h是这个样子:
#pragma comment(lib,"E:/project/camera/project/PCL/bin/3rdParty/Boost/lib/libboost_atomic-vc142-mt-gd-x64-1_76.lib")
#pragma comment(lib,"E:/project/camera/project/PCL/bin/3rdParty/Boost/lib/libboost_atomic-vc142-mt-x64-1_76.lib")
#pragma comment(lib,"E:/project/camera/project/PCL/bin/3rdParty/Boost/lib/libboost_bzip2-vc142-mt-gd-x64-1_76.lib")
编译后出错:
1>LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc142-mt-gd-x64-1_76.lib'
但是这个文件已经在lib.h中已经添加了,而且文件确实存在,应该是vs2019的bug
于是我们把这个文件所在的目录添加到lib的路径中:
E:\project\camera\project\PCL\bin\3rdParty\Boost\lib
编译通过
然后把生成exe的目录换到之前安装的目录上去:
E:\project\camera\project\PCL\bin\bin
于是我们看到编译好的exe已经出现在E:\project\camera\project\PCL\bin\bin中了
现在准备点云pcd文件
到现在为止,一切准备就绪了,打断点,运行试试
兔子出来了!
2 PCL 1.12.0 源代码编译
2.1 下载
从官网下载source.tar.gz这个文件,解压
进入解压后的子目录,我的目录是
E:\project\camera\project\PCL\pcl-1.12.0
2.2 cmake
如果没有安装cmake,需要先安装cmake最新版本。
在控制台下面输入cmake-gui
启动cmake
Where is the source code: 指向pcl的源代码,就是刚才解压的源代码,我E:\project\camera\project\PCL\pcl-1.12.0
Where to build the binaries: 指向编译后的数据存放地点,这个可以随便指定
点击Configure按钮
然后会生成一堆东西,各种错误,实际是6个软件包的位置没有指定好,这6个软件包是:
Boost
Eigen
FLANN
OpenNI2
Qhull
VTK
这6个软件包中,有一个很特殊,Eigen他提供的是源代码,而且他很怪,源代码全是以头文件的形式提供,其他软件使用Eigen的时候,只需要把这些h文件include进入自己的源代码即可。
此外Boost是提供的静态库。
其他4个软件包都是以lib和dll的形式提供给其他软件调用。
现在出了一堆错误
2.2.1
切换EIGEN的目录:
再点击Configure
这个时候说的是FLANN的目录没有指定
再点击Configure按钮
因为我的电脑是AMD的,并没有cuda,所以我就要去掉cuda
去掉这个WITH_CUDA
去掉WITH_PCAP
去掉这个WITH_PCAP
Qhull的目录设好
这个QT的部分,我之前电脑上已经安装QT了,而且也安装了anaconda3,他自动找到了
设定安装目录:
2.2.2 VTK的安装
接下来应该安装VTK_DIR了
CMake Warning at cmake/pcl_find_vtk.cmake:25 (find_package):
By not providing "FindVTK.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "VTK", but
CMake did not find one.
Could not find a package configuration file provided by "VTK" with any of
the following names:
VTKConfig.cmake
vtk-config.cmake
很奇怪,既然VTK实际前面已经下载,但是他只是库,这个意思是要VTK的源代码啊,那就去下载VTK源代码吧,下载后放在这里
VTK-9.1.0
设定好目录
在Configure
VTK还是不行。
那就先编译VTK把
这个cmake先关闭
重新打开cmake-gui,把源代码切换到刚才现在的vtk中,Build目录另外找一个目录
点击Configure,出错,一堆红色,再点击Configure,ok
这个地方要注意,把那个VTK的安装目录不要设置在C盘,C盘的读写需要特定权限,我把他设定在
E:\project\camera\project\PCL\bin\3rdParty\VTK
如图:
再Configure,Generate,Open Porject
在vs2019中编译非常顺利,编译完成之后,
可以发现
Skipped Build: Project: INSTALL, Configuration: Debug x64 ------
259>Project not selected to build for this solution configuration
在INSTALL这个项目上右键set startup project
在INSTALL 右键Build
于是VTK就被安装了,
E:\project\camera\project\PCL\bin\3rdParty\VTK
目录上已经被安装好了
关闭cmake-gui。
重新打开cmake-gui,把build目录切换到
E:/project/camera/project/PCL/bin/build
把VTK_DIR设定为刚才VTKBild那个子目录,就是VTK编译的目录,再点击Configure,发现VTK错误不见了。
2.2.3 Boost的问题。
再Configure之后,Boost错误出现了:
Could NOT find Boost (missing: Boost_INCLUDE_DIR filesystem date_time
iostreams system) (Required is at least version "1.65.0")
这就是说Boost找不到。
但是这个里面并没有找到 Boost_INCLUDE_DIR 这一行,那就添加吧
电机Add Entry按钮添加:
继续Configure,无效,还是同样的错误。
到网上查资料,发现有人说:
CMake/share/cmake-3.18/Modules/FindBoost.cmake 文件里规定的debug参数: Boost_DEBUG=ON
添加一个Entry: Boost_DEBUG,设置为True
点击Configure
出现一堆调试信息
然后可以看到:
BOOST_ROOT
BOOST_INCLUDEDIR
BOOST_LIBRARYDIR
都没有设定好。于是加入3个entry
BOOST_ROOT设定为:E:\project\camera\project\PCL\bin\3rdParty\Boost
BOOST_INCLUDEDIR设定为:E:\project\camera\project\PCL\bin\3rdParty\Boost\include
BOOST_LIBRARYDIR设定为:E:\project\camera\project\PCL\bin\3rdParty\Boost\lib
Boost是一个静态库
再点击configure,似乎就过了
点击Generate,然后再点击Open Project
2.3 PCL编译
点击cmake的OpenProject后就打开了vs2019
编译,出错
Build started: Project: pcl_io
E:\project\camera\project\PCL\pcl-1.12.0\io\include\pcl/io/vtk_lib_io.h(71,10): fatal error C1083: Cannot open include file: 'vtkPolyDataNormals.h': No such file or directory
vtkPolyDataNormals.h这个文件出现在
E:\project\camera\project\PCL\bin\3rdParty\VTK\include\vtk-9.1
找到这个出错的项目
如上图所示:
E:\project\camera\project\PCL\bin\3rdParty\VTK\include\vtk-9.1
加入到Include Directories
编译后这个pcl_io项目就编译成功了
后面出现的错误基本都是这个情况,把
E:\project\camera\project\PCL\bin\3rdParty\VTK\include\vtk-9.1
添加到对应项目的Include Directories就可以了
编译完成以后,开始安装:
把INSTALL这个目录上右键选Set as Startup Project,然后INSTALL 右键Build。
发现这个PCL被安装到
E:\project\camera\project\PCL\bin\bin
下面了
现在删除掉之前安装包安装的PCL,使用新生成的PCL安装包。
运行searchlib.py,会找到全部的lib,然后生成lib.h
此时各种动态库的路径为:
E:\project\camera\project\PCL\bin\3rdParty\FLANN\bin
E:\project\camera\project\PCL\bin\3rdParty\OpenNI2\Redist
E:\project\camera\project\PCL\bin\3rdParty\Qhull\bin
E:\project\camera\project\PCL\bin\3rdParty\VTK\bin
E:\project\camera\project\PCL\bin\bin\bin
把这些DLL库的路径加入到你的PATH,下面调试后的时候好找到这些DLL。
现在把上面写好那个读PCD文件的例子用这个来编译,发现一切ok。
运行:
啥也没有啊
点击画面,滚动鼠标
Ok
有问题联系我: panxixue@qq.com