一、实现逻辑
1、通过PCL库的getMinMax3D得到xyz轴上的最大最小值;
函数原型:
pcl::getMinMax3D(const pcl::PointCloud<PointT> &cloud, POintT &min_pt, PointT &max_pt)
2、设置切片厚度,计算某一轴方向上的切片数量,循环遍历该数量;
3、通过PCL库的PassThrough对点云进行切片
通过PassThrough的setFilterLimits设置切片范围。
函数原型:
setFilterLimits(const float &limit_min,const float &limit_max)
由此便可通过循环遍历切片数量来设置切片范围,递进式对点云进行指定厚度的切片。
二、代码实现
//-----------------.h头文件部分-----------------//
//读取点云的头文件
#include <pcl/io/pcd_io.h>//点云切片的头文件
#include <pcl/common/common.h>
#include <pcl/filters/passthrough.h>//io流的头文件
#include <iostream>//-----------------.cpp文件部分-----------------////初始化一个点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//加载点云文件
if(pcl::io::loadPCDFile("cloud.pcd",*cloud)==-1)
{//此处cloud.pcd是你的点云文件
}//初始化三个轴最大最小值的容器
pcl::PointXYZ minValues;
pcl::PointXYZ maxValues;
//计算三个轴的最大最小值
pcl::getMinMax3D(*cloud,minValues,maxValues);//选择x轴做切片
double xMax = maxValues.x;
double xMin = minValues.x;
//设置切片厚度
double sliceInterval = 0.5;
//计算x轴方向的切片总数
int sliceNum_x = floor((xMax-xMin)/sliceInterval)-1;
//设置切片起始值
double sliceBeginCoordinate = xMin;
//初始化保存切片的点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_Save(new pcl::PointCloud<pcl::PointXYZ>);
//循环获取切片
for(int i = 0; i<= sliceNum_x ;++i)
{float min_value = sliceBeginCoordinate; //切片的起始值//给保存的点云命名std::ostringstream oss;oss << "cloud_section" << i << ".pcd";std::string slice_name = oss.str();//直通滤波对象pcl::PassThrough<pcl::PointXYZ> pass;pass.setInputCloud(cloud);pass.setFilterFieldName("x"); //选择x轴pass.setFilterLimits(min_value ,min_value + sliceInterval ) //切片范围pass.filter(*cloud_Save);//保存切片if(!cloud_Save->empty()){pcl::io::savePCDFile(slice_name ,*cloud_Save);cloud_Save->clear();}sliceBeginCoordinate = min_value + sliceInterval;
}
三、实现效果
以上是切片实现的基础内容,如果需要配合上其它操作方式自行添加,例如使用QT+PCL对点云切片的可控操作;