前言
最近刚入坑pcl,打算记录一下自己的学习历程。
安装pcl前的准备
本教程使用的是windows下的预编译包安装,要想顺利编译程序,需要安装好微软的Visual Studio IDE和cmake。这两者安装过程笔者不详细介绍,读者可以自行百度。建议cmake安装gui版本。Visual Studio是集成开发环境,cmake是c/c++跨平台编译工具。
pcl的预编译包链接:https://pan.baidu.com/s/1hWi3_hELh1MVZihHV23juQ
提取码:ouzu
笔者提供了1.8和1.12两个版本,读者可以自行选择安装。每个版本的文件夹有两个文件。笔者的教程是以1.12版本为例。
安装步骤
双击下载的exe文件出现如下:
点击下一步
点击接受
如上图需要添加环境变量
然后选择安装位置,等待安装完成即可。
然后把另外一个压缩文件解压,会得到包含一些pdb后缀的文件,全选这些文件,复制到pcl安装目录下的bin文件夹中。
openni的安装
随后便需要安装openni,进入pcl安装目录中,进入3rdParty文件夹,进入openni2文件夹。里面有一个OpenNI-Windows-x64-2.2.msi文件,双击,如果以前安装过openni建议点击remove移除重新安装。然后安装的路径选择3rdParty下的openni2目录。
检查环境变量
安装之后需要检查一下,安装好的环境如下
打开环境变量页面查看,首先在系统变量中会有一个PCL_ROOT变量,这个变量的路径是pcl安装路径。
上图是用户变量下path里面需要添加的。
测试
建立一个kdtree_search.cpp文件,代码如下:
#include<iostream>
using namespace std;
#include<pcl/point_cloud.h>
#include<pcl/kdtree/kdtree_flann.h>
#include<vector>
#include<ctime>
int main(int argc,char** arv)
{
//随机种子,srand里面的值每次都是一样的,那么生成的随机数不变,否则会变
srand(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);
}
//创建kd-tree对象
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
//设置cloud的搜索空间
kdtree.setInputCloud(cloud);
//定义一个查询节点,并且用来查询
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);
//k近邻搜索
int k=10;
//保存查询点的k近邻索引
vector<int> pointIdxNKNSearch(k);
//保存k近邻点对应的欧氏距离
vector<float> pointNKSquaredDistance(k);
cout<<"k nearest neighbor search at ("<<searchPoint.x
<<" "<<searchPoint.y<<" "<<searchPoint.z<<") with k="<<k<<endl;
//执行k近邻搜索,并且打印相应信息
if(kdtree.nearestKSearch(searchPoint,k,pointIdxNKNSearch,pointNKSquaredDistance)>0)
{
cout<<"k nearest neighbor:"<<endl;
for(size_t i=0;i<pointIdxNKNSearch.size();++i)
{
cout<<" "<<cloud->points[pointIdxNKNSearch[i]].x
<<" "<<cloud->points[pointIdxNKNSearch[i]].y
<<" "<<cloud->points[pointIdxNKNSearch[i]].z
<<" (squared distance:"<<pointNKSquaredDistance[i]<<")"<<endl;
}
//半径r内近邻搜索方式
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(kdtree.radiusSearch(searchPoint,radius,pointIdxRadiusSearch,pointRadiusSquaredDistance)>0)
{
cout<<"radius search:"<<endl;
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;
}
}
else
{
cout<<"no radius search"<<endl;
}
}
return 0;
}
建立一个CMakeLists.txt文件,内容如下:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(kdtree_search)
find_package(PCL 1.12 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(kdtree_search kdtree_search.cpp)
target_link_libraries(kdtree_search ${PCL_LIBRARIES})
这两个文件放在同一个文件夹下,然后在同级目录下建立一个build文件,用来存放编译产生的中间文件。然后打开cmd,cd到build文件夹,cmd输入cmake ..
回车执行完毕后找到build文件夹下sln后缀的文件双击用vs打开。在生成中点击重新生成解决方案开始编译。编译完成后进入Debug文件夹,能找到exe可执行文件。然后进入cmd cd到Debug文件夹,输入exe可执行文件的全名称,就可以运行程序了,运行程序结果如下:
至此,pcl安装就完毕了。