文章禁止转载,因为转载的,第一排版难看,第二不说明出处,所以不许转载。(但是人家要转载,我也不知道,除非收费)
原理说明
配置这种PCL点云库,思想就是让编译软件能够找到那些库啊,包啊等等吧。
吐槽
这种东西,真的是人家开发商就一点都不担心用户的问题,不管多难配置,人家开发商就有信心,我们就是会用。像其他应用,例如有道词典啊,或者百度网盘啊,对比下来真的是地位卑微,软件安装完以后,自动就嵌入到了word或者此电脑里面了,生怕我们多花一点时间去配置,言归正传,开始吧。
开始
需要的东西: visual studio 2019,PCL1.11.1(我用的是这个版本,建议用这个对应的版本吧)
PCL1.11.1下载
下载地址:先下载这两个文件
PCL1.11.1安装
安装PCL-1.11.1-AllInOne-msvc2019-win64.exe
第一步:欢迎使用(跳过);
第二步:许可证协议(跳过);
第三步:如下图,点第二个,添加环境变量
第四步:安装目录(这个肯定要记一下)
第五步:安装结束(没有图)
安装OpenNI-Windows-x64-2.2.msi
上面的安装结束以后,打开这个文件夹D:\Install\PCL 1.11.1\3rdParty\OpenNI2
,里面有个OpenNI-Windows-x64-2.2.msi
文件,打开它,进行安装。
第一步:欢迎安装(跳过);
第二步:我这边已经安装过了,所以会出现移除或者修复,想重新安装肯定是选择remove
,估计看这个教程很多人都是第一次安装,那就选change
,将路径选择到D:\Install\PCL 1.11.1\3rdParty\OpenNI2
这里安装就行。就不要问我为什么安装到D:\Install\PCL 1.11.1\3rdParty\OpenNI2
这里了。
安装完以后,内容如下所示。到这里,PCL-1.11.1-AllInOne-msvc2019-win64.exe
就安装完了,但我们一开始下载了两个文件,还有一个pcl-1.11.1-pdb-msvc2019-win64
文件没弄。
pcl-1.11.1-pdb-msvc2019-win64安装
这个文件就很简单了,把这里面所有的.pdb文件全部复制到D:\Install\PCL 1.11.1\bin
里面去。文件就这么些,该安装的都安装完了,然后就开始配置环境变量吧,这样方便编译软件能够找到这些文件。
环境变量配置
这些系统变量,复制进去
%PCL_ROOT%\bin
%PCL_ROOT%\3rdParty\VTK\bin
%PCL_ROOT%\3rdParty\FLANN\bin
%OPENNI2_REDIST64%
%PCL_ROOT%\3rdParty\Qhull\bin
%PCL_ROOT%\3rdParty\OpenNI2\Tools
估计不好理解,图片打个样吧。按照这种,上下都复制一遍
最后在系统变量里面,就是下面这个样子,就这么六条。
到这里,环境变量就配置完了,然后就开始去配置Visual studio2019吧,那边东西多一点,等我喝口水,慢慢来。
Visual studio2019配置
第一步:新建空白项目
第二步:选C++
第三步:文件命名(跳过)
第四步:新建一个c++文件。右击源文件
->添加
->新建项
,然后这种
第五步:改为Debug
和×64
。
第六步:右击项目名称那里,找到属性
。
这里也改为Debug和×64
配置管理器里面也改一下。(配置管理器上图中有,看一下,篮框)
下面的事情就分五步,这六步搞定,马上收工。
六步
第一步:配置包含目录和源目录。
将这些目录放到VC++目录
->包含目录
->源目录
里面。看一下自己的目录是什么,对照的稍微调一下。
$(PCL_ROOT)\include\pcl-1.11;$(PCL_ROOT)\3rdParty\Boost\include\boost-1_74;$(PCL_ROOT)\3rdParty\Eigen\eigen3;$(PCL_ROOT)\3rdParty\FLANN\include;$(PCL_ROOT)\3rdParty\Qhull\include;$(PCL_ROOT)\3rdParty\VTK\include\vtk-8.2;$(PCL_ROOT)\3rdParty\OpenNI2\Include;
第二步:配置库目录。
将这些目录放到VC++目录
->库目录
里面。看一下自己的目录是什么,对照的稍微调一下。
$(PCL_ROOT)\lib;$(PCL_ROOT)\3rdParty\Boost\lib;$(PCL_ROOT)\3rdParty\FLANN\lib;$(PCL_ROOT)\3rdParty\Qhull\lib;$(PCL_ROOT)\3rdParty\VTK\lib;$(PCL_ROOT)\3rdParty\OpenNI2\Lib;
第三步:配置调试
->环境
。
将这些目录放到调试
->环境
里面。看一下自己的目录是什么,对照的稍微调一下。
PATH=$(PCL_ROOT)\bin;$(PCL_ROOT)\3rdParty\FLANN\bin;$(PCL_ROOT)\3rdParty\VTK\bin;$(PCL_ROOT)\3rdParty\OpenNI2\Tools;
第四步:配置C/C++
->预处理器
->预处理器定义
将这些目录放到C/C++
->预处理器
->预处理器定义
里面。这个不用改
_SCL_SECURE_NO_WARNINGS;_CRT_SECURE_NO_WARNINGS;
第五步:配置链接器
->输入
->附加依赖项
这里要认真看,不要偷懒哦,宝贝们。
这里有两个版本的附加依赖项,很多教程直接就放一大串的文件名,让大家复制进去,这是不对的,我来和大家说一下,怎么来生成自己的那些文件名吧。
只需要将D:\Install\PCL 1.11.1\3rdParty\VTK\lib
和D:\Install\PCL 1.11.1\lib
这两个文件夹下的lib文件分开就是。文件夹中*.lib
是release版本,*d.lib
是debug版本,我用的是debug版本。
首先来到D:\Install\PCL 1.11.1\lib
文件夹下面,打开cmd
cmd
中输入这条命令dir /b *.lib *>0.txt
,会生成一个0.txt
文件,把0.txt
里面的0.txt
和pcl_visualizationd.lib pkgconfig
删了。0.txt
里面包含两个版本的文件名。我们需要将它们分开。最后分吧。
同样来到D:\Install\PCL 1.11.1\3rdParty\VTK\lib
文件夹下面,打开cmd
,输入这条命令dir /b *.lib *>1.txt
,会生成一个1.txt
文件,把1.txt
里面的1.txt
和cmake
删了。1.txt
里面包含两个版本的文件名。我们需要将它们分开。最后分吧。
现在我们有两个文档0.txt和1.txt,分开就行,用python分吧,快的很。代码如下
debug_file = open("debug.txt", 'w+')
with open('0.txt') as f:
i = 0
for line in f:
if i % 2 == 1:
print(line.strip(), file=debug_file)
i = i + 1
with open('1.txt') as f:
i = 0
for line in f:
if i % 2 == 0:
print(line.strip(), file=debug_file)
i = i + 1
文件目录结构如下所示。
然后在debug.txt里面就有很多的*d.lib文件名,现在复制到附加依赖项里面就行。
第六步:设置一些否
选项
到这里其实应该就没啥大问题了,不过可能还要设置一点,也不难,跟着来吧。
第一个否
:
第二个否
:
测试代码
到这里,就全部设置完了,下面来一段代码测试吧。
#include <iostream>
#include <vector>
#include <ctime>
#include <pcl/point_cloud.h>
#include <pcl/octree/octree.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
int
main(int argc, char** argv)
{
srand((unsigned int)time(NULL));
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 创建点云数据
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<pcl::PointXYZ> 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);
//半径内近邻搜索
vector<int>pointIdxRadiusSearch;
vector<float>pointRadiusSquaredDistance;
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_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("显示点云"));
viewer->setBackgroundColor(0, 0, 0); //设置背景颜色为黑色
// 对点云着色可视化 (red).
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>target_color(cloud, 255, 0, 0);
viewer->addPointCloud<pcl::PointXYZ>(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);
}
出现下面的图片,搞定的同学,到点吃饭;没搞定的,继续百度,必应,谷歌。
参考来源
任何一篇文章都不是空穴来风,这里标出参考来源