1)准备工作
(1)获取All in one安装包,PCL提供了配置为Visual Studio的32位和64位下的该安装包,该包包含类PCL中所使用全部第三方编译包,除了QT编译包。
(2)获取All in one包对应的PDB文件包,该包用于后期单步调试时使用。
(3)获取PCL源码包。
(4)安装开发工具Visual Studio编译器和CMake开发工具,需要CMake版本大于2.8.3,主要考虑到PCL中用到了高版本的一些宏定义,低版本并兼容。
All in one安装包和PDB安装包都可以在git上进行下载:
Releases · PointCloudLibrary/pcl · GitHub
源码也可以在git上进行下载或者克隆:
GitHub - PointCloudLibrary/pcl: Point Cloud Library (PCL)
(ps. 再次吐槽公司网络!!!!!巨慢
(ps:我在网盘里放了相关的安装包以及一些点云文件,如果需要的话可以私聊邮箱
顺便说一下我的安装环境是:VS2019 + PCL 1.12.0
2)开始安装
(1)下载好两个文件以后,先安装All in one:
下载路径的话,选择D盘,会自动生成一个下载路径:D:\PCL 1.12.0
(2)完成安装以后需要去:D:\PCL 1.12.0\3rdParty\OpenNI2 查看一下OpenNI有没有安装到这个文件夹。因为默认安装的路径是C盘,如果发现文件夹里只有一个NI的安装包的话,就打开安装程序:
点击Remove,重新安装并选择路径为:D:\PCL 1.12.0\3rdParty\OpenNI2,安装完成以后文件夹里就会有这些文件:
(3)将下载的PDB文件,解压到:D:\PCL 1.12.0\bin 文件夹下:
(4)设置环境变量:
依次点击:高级系统设置--高级--环境变量--用户Path--新建--输入相应的环境变量--不要忘记点确定!
环境变量如下:
%PCL_ROOT%\3rdParty\FLANN\bin
%PCL_ROOT%\3rdParty\VTK\bin
%OPENNI2_REDIST64%
%OPENNI2_LIB64%
%OPENNI2_INCLUDE64%
注意:环境变量输入好以后,一定要点击确定,每个确定都要点,配置好环境后重启电脑。
3)Visual Studio环境配置
(1)新建一个C++空项目:
解决方案设置为Debug,基于X64平台:
(2)在源文件中新建一个C++源文件:
(3)右键之前新建的项目(注意不是源文件),选择:属性--配置属性--调试--环境--编辑,添加如下的环境(需要注意这些环境路径需要根据你下载的版本,以及下载的文件所在位置进行调整):
PATH=D:\PCL 1.12.0\\bin;D:\PCL 1.12.0\\3rdParty\FLANN\bin;D:\PCL 1.12.0\\3rdParty\VTK\bin;D:\PCL 1.12.0\\3rdParty\OpenNI2\Tools
接着,选择:C/C++--语言--符合模式--设置为否:
最后,设置:C/C++--所有选项--SDL检查--设置为否:
一定要记得点应用!!!再点确定呀!!!!
4)配置PCL 1.12.0属性表
为了方便使用,选择添加属性表的方式进行PCL 1.12.0的配置,这需要将属性表的SDL检查也设置为否,否则会出现报错!
(1)显示属性管理器:视图--其他窗口--属性管理器
(2)在属性管理器里找到Debug|x64,右键打开后选择新建新的项目属性表:
(3)设置名称为:PCL1.12.0.props
(4)右键新建的属性表,打开属性:C/C++ -- 所有选项 -- SDL检查 -- 设置为否:
(5)选择VC++目录 -- 包含目录 -- 编辑 --添加新的目录如下(这些目录可能会根据你安装的版本和路径有所变动,注意调整):
安装的目录如下:
D:\PCL 1.12.0\include\pcl-1.12
D:\PCL 1.12.0\3rdParty\Boost\include\boost-1_76
D:\PCL 1.12.0\3rdParty\Eigen\eigen3
D:\PCL 1.12.0\3rdParty\FLANN\include
D:\PCL 1.12.0\3rdParty\Qhull\include
D:\PCL 1.12.0\3rdParty\VTK\include\vtk-9.0
D:\PCL 1.12.0\3rdParty\OpenNI2\Include
(6)选择VC++目录 -- 库目录 -- 编辑 --添加新的目录如下(这些目录可能会根据你安装的版本和路径有所变动,注意调整):
安装库如下:
D:\PCL 1.12.0\lib
D:\PCL 1.12.0\3rdParty\Boost\lib
D:\PCL 1.12.0\3rdParty\FLANN\lib
D:\PCL 1.12.0\3rdParty\Qhull\lib
D:\PCL 1.12.0\3rdParty\OpenNI2\Lib
D:\PCL 1.12.0\3rdParty\VTK\lib
(7)选择C/C++ -- 预处理器 -- 预处理器定义 -- 编辑 --添加预处理器定义如下:
预处理器定义如下:
BOOST_USE_WINDOWS_H
NOMINMAX
_CRT_SECURE_NO_DEPRECATE
(8)重要的操作来了:批量获取附加依赖项
首先,快捷键win+r调出运行窗口,输入cmd,在cmd窗口输入以下代码:
cd/d D:\PCL 1.12.0\3rdParty\VTK\lib
dir/b *.lib *>0.txt
上述代码可以将VTK中的所有lib文件以txt的形式输出到0.txt文件中:
注意,PCL和VTK的库都需要进行调取:
注意:读取出来的链接库包含了Release版本和Debug版本(带d的),这里用Debug版本的链接库。
用以下代码可以将Release版本和Debug版本区分开来:
#include
#include
#include
#include
using namespace std;
int main()
{
ifstream txtfile;//打开读取的文件
ofstream txt01;//保存的文件
ofstream txt02;//保存的文件
string temp;
int index = 0;//用于判断奇偶
txtfile.open("0.txt", ios::in);
while (!txtfile.eof()) // 若未到文件结束一直循环
{
getline(txtfile, temp);//一行一行读取
if (index%2==0)//判断除以2的余数,即为奇偶的判断
{
txt01.open("1.txt", ios::app);
txt01 << temp;
txt01 << endl;
txt01.close();
}
else
{
txt02.open("2.txt", ios::app);
txt02 << temp;
txt02 << endl;
txt02.close();
}
index++;
}
txtfile.close(); //关闭文件
txtfile.close();
txt01.close();
txt02.close();
return 0;
}
或者也可以选择全部复制到依赖项里面,然后删掉Release版本的链接库。
完成属性表的配置后,记得保存属性表,以后在使用时只要,重复Visual Studio的配置,然后添加现有的属性表PCL 1.12.1.props即可。
5)代码测试
输入以下代码进行测试:
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int
main(int argc, char** argv)
{
srand((unsigned int)time(NULL));
pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
// 创建点云数据
cloud->width = 1000;
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.0f * rand() / (RAND_MAX + 1.0f);
cloud->points[i].y = 1024.0f * rand() / (RAND_MAX + 1.0f);
cloud->points[i].z = 1024.0f * rand() / (RAND_MAX + 1.0f);
}
pcl::octree::OctreePointCloudSearch octree(0.1);
octree.setInputCloud(cloud);
octree.addPointsFromInputCloud();
pcl::PointXYZ searchPoint;
searchPoint.x = 1024.0f * rand() / (RAND_MAX + 1.0f);
searchPoint.y = 1024.0f * rand() / (RAND_MAX + 1.0f);
searchPoint.z = 1024.0f * rand() / (RAND_MAX + 1.0f);
//半径内近邻搜索
vectorpointIdxRadiusSearch;
vectorpointRadiusSquaredDistance;
float radius = 256.0f * rand() / (RAND_MAX + 1.0f);
cout << "Neighbors within radius search at (" << searchPoint.x
<< " " << searchPoint.y
<< " " << searchPoint.z
<< ") with radius=" << radius << endl;
if (octree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
{
for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i)
cout << " " << cloud->points[pointIdxRadiusSearch[i]].x
<< " " << cloud->points[pointIdxRadiusSearch[i]].y
<< " " << cloud->points[pointIdxRadiusSearch[i]].z
<< " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << endl;
}
// 初始化点云可视化对象
boost::shared_ptrviewer(new pcl::visualization::PCLVisualizer("显示点云"));
viewer->setBackgroundColor(0, 0, 0); //设置背景颜色为黑色
// 对点云着色可视化 (red).
pcl::visualization::PointCloudColorHandlerCustomtarget_color(cloud, 255, 0, 0);
viewer->addPointCloud(cloud, target_color, "target cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "target cloud");
// 等待直到可视化窗口关闭
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(1000));
}
return (0);
}
输出结果如下:
那么在windows下搭建PCL环境就完成了!