一、实现逻辑
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对点云切片的可控操作;