欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PCL 基于颜色的区域生长分割

程序员文章站 2022-05-20 21:10:33
...

一、算法原理

该算法与区域生长算法一样,时基于同一策略之上的,与区域生长相比,该算法主要有两处不同。第一,该算法用颜色代替了法线测试。第二,利用合并算法来控制过分割或欠分割。分割过程中,若两个相邻聚类的平均颜色相差较少,则将这两个聚类合并。然后进行第二步合并,在此步骤中,检查每一个聚类所包含的点的数量,如果这个数量小于用户定义的值,则当前这个聚类与其相近邻聚类合并在一起。
Color-based region growing segmentation

二、代码实现

#include <iostream>
#include <vector>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/search/search.h>
#include <pcl/search/kdtree.h>
#include <pcl/visualization/cloud_viewer.h>
#include <boost/thread/thread.hpp>
#include <pcl/filters/passthrough.h>
#include <pcl/segmentation/region_growing_rgb.h>

using namespace std;

int
main(int argc, char** argv)
{
    

    pcl::PointCloud <pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud <pcl::PointXYZRGB>);
    if (pcl::io::loadPCDFile <pcl::PointXYZRGB>("region_growing_rgb_tutorial.pcd", *cloud) == -1)
    {
        cout << "Cloud reading failed." << endl;
        return (-1);
    }
    //-------------------------直通滤波----------------------------
    pcl::IndicesPtr indices(new std::vector <int>);
    pcl::PassThrough<pcl::PointXYZRGB> pass;
    pass.setInputCloud(cloud);
    pass.setFilterFieldName("z");
    pass.setFilterLimits(0.0, 1.0);
    pass.filter(*indices);
    //-----------------可以同时用颜色测试和法线测试这两种手段-----------------------
    pcl::search::Search <pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>);
    pcl::RegionGrowingRGB<pcl::PointXYZRGB> reg;
    reg.setInputCloud(cloud);
    reg.setIndices(indices);
    reg.setSearchMethod(tree);
    reg.setDistanceThreshold(10);//设置距离阈值,用于聚类相邻点搜索
    reg.setPointColorThreshold(6);//设置两点颜色阈值
    reg.setRegionColorThreshold(5);//设置两类区域颜色阈值
    reg.setMinClusterSize(600);//设置一个聚类的最少点数目

    vector <pcl::PointIndices> clusters;
    reg.extract(clusters);//获取聚类的结果,分割结果保存在点云索引的向量中
    //------------对不同的聚类分割结果,随机赋予颜色---------------------------
    pcl::PointCloud <pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud();
    //----------------------------可视化----------------------------------------
    pcl::visualization::CloudViewer viewer("Cluster viewer");
    viewer.showCloud(colored_cloud);
    while (!viewer.wasStopped())
    {
        
    }

    return 0;
}

三、结果展示

PCL 基于颜色的区域生长分割

四、官网链接

pcl::RegionGrowingRGB