该算法与区域生长算法有两点不同
第一:用颜色测试代替了法线测试,若两个相邻聚类的平均颜色相差较小,则将两个聚类合并;
第二:利用合并算法来控制过分割或欠分割,检查当前聚类的点数量,若小于设定阈值,则将该聚类通邻近聚类合并。
部分代码:
(1)直通滤波;
pcl::PassThrough<pcl::PointXYZRGB> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z");
pass.setFilterLimits(near_cuting, far_cuting);
pass.filter(*indices);
(2)实例化pcl::RegionGrowingRGB类,并设置分割参数;
pcl::RegionGrowingRGB<pcl::PointXYZRGB> reg;
reg.setInputCloud(cloud);
if (Bool_Cuting)reg.setIndices(indices);
reg.setSearchMethod(tree);
reg.setDistanceThreshold(DistanceThreshold);//点距离阈值,用于搜索聚类
reg.setPointColorThreshold(ColorThreshold);//点颜色阈值
reg.setRegionColorThreshold(RegionColorThreshold);//两类区域颜色阈值
reg.setMinClusterSize(MinClusterSize);//聚类最少点数阈值
(3)获取聚类结果,保存在点云索引向量中。
std::vector <pcl::PointIndices> clusters;
reg.extract(clusters);
运行结果: