函数原型:
pcl::getMinMax3D(const pcl::PointCloud<PointT> &cloud, POintT &min_pt, PointT &max_pt)
通过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对点云切片的可控操作;
