1.点云切割概述
点云分割是根据空间,几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征,点云的有效分割往往是许多应用的前提,例如逆向工作,CAD领域对零件的不同扫描表面进行分割,然后才能更好的进行空洞修复曲面重建,特征描述和提取,进而进行基于3D内容的检索,组合重用等。
2.PCL中常用的点云分割方法
Plane model segmentation (平面模型分割):这个算法能够把地面等一些平面给分割出来,方便后面的物体的点云分割。
Cylinder model segmentation(圆柱模型分割):这个算法能够把一些圆柱体分割出来,方便后面的物体的点云分割。
Euclidean Cluster Extraction (欧几里德聚类提取):这个算法通俗来讲就是先从点云中找出一个点p0,然后寻找p0周围最近的n个点,如果这n个点与p0之间的距离小于预先设定的阈值,那么就把这个点取出,依次重复。
Region growing segmentation (区域蔓延分割):对于普通点云,其可由法线、曲率估计算法获得其法线和曲率值。通过法线和曲率来判断某点是否属于该类,向周边蔓延直至完成。
Progressive Morphological Filter(渐进形态过滤器):这个算法本身用于处理高空获取的激光雷达数据,把地面与非地面的物体分割,也就是可以将地面分割出来使其他物体悬空,为下一步打基础。
3.几种分割的使用实例
3.1.简单平面分割
这个算法分割点云的平面的原理就是,通过改变平面模型(ax+by+cz+d=0)的参数,找出哪一组的参数能使得这个模型一定程度上拟合最多的点。这个程度就是由distancethreshold这个参数来设置。那找到这组参数后,这些能够被拟合的点就是平面的点。总体感受就是这个算法如果理解的不好调参有点复杂。
代码:
#include <iostream>
#include <pcl/ModelCoefficients.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/method_types.h> //随机参数估计方法头文件
#include <pcl/sample_consensus/model_types.h> //模型定义头文件
#include <pcl/segmentation/sac_segmentation.h> //基于采样一致性分割的类的头文件
#include <pcl/filters/extract_indices.h>
#include <pcl/visualization/cloud_viewer.h>
int
main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 读取一个PCD文件
if (pcl::io::loadPCDFile<pcl::PointXYZ>("d:/2.pcd", *cloud) != 0)
{
return -1;
}
//创建分割时所需要的模型系数对象,coefficients及存储内点的点索引集合对象inliers
pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
// 创建分割对象
pcl::SACSegmentation<pcl::PointXYZ> seg;
// 可选择配置,设置模型系数需要优化
seg.setOptimizeCoefficients (true);
// 必要的配置,设置分割的模型类型,所用的随机参数估计方法,距离阀值,输入点云
seg.setModelType (pcl::SACMODEL_PLANE); //设置模型类型
seg.setMethodType (pcl::SAC_RANSAC); //设置随机采样一致性方法类型
seg.setDistanceThreshold (5); //设定距离阀值,距离阀值决定了点被认为是局内点是必须满足的条件