[点云分割] 点云地面点滤波(Progressive Morphological Filter)

介绍

机载LiDAR可以获取快速、低成本地获取大区域的高精度地形测量值。为了获取高精度DTM/DEM需要区分测量点中的地面点(由地面直接返回)及非地面点(建筑、车、植被)

代码

#include 
#include 
#include 
#include 
#include 

int main ()
{
    pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
    pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud);
    pcl::PointIndicesPtr ground (new pcl::PointIndices);
    
    // Fill in the cloud data
    pcl::PCDReader reader;
    // Replace the path below with the path where you saved your file
    reader.read ("samp11-utm.pcd", *cloud);
   
    std::cerr << "Cloud before filtering: " << std::endl;
    std::cerr << *cloud << std::endl;
 
    // Create the filtering object
    pcl::ProgressiveMorphologicalFilter pmf;
    pmf.setInputCloud (cloud);
    pmf.setMaxWindowSize (20); //设置了最大窗口大小为20。这个参数表示滑动窗口的大小,用于计算每个点的地面高度。
    pmf.setSlope (1.0f); // 设置了斜率参数为1.0。这个参数用于控制地面的斜率范围,只有斜率小于等于该值的点才会被认为是地面。
    pmf.setInitialDistance (0.5f); // 设置了初始距离参数为0.5。这个参数表示初始的地面距离阈值,用于确定地面点的初始高度。
    pmf.setMaxDistance (3.0f); // 设置了最大距离参数为3.0。这个参数表示地面点的最大高度阈值,超过该高度的点将不被认为是地面。
    pmf.extract (ground->indices); // 将提取得到的地面点的索引存储在ground->indices中
    
    // Create the filtering object
    pcl::ExtractIndices extract;
    extract.setInputCloud (cloud);
    extract.setIndices (ground);
    extract.filter (*cloud_filtered);
    
    std::cerr << "Ground cloud after filtering: " << std::endl;
    std::cerr << *cloud_filtered << std::endl;
    
    pcl::PCDWriter writer;
    writer.write ("samp11-utm_ground.pcd", *cloud_filtered, false);
  
    // Extract non-ground returns
    extract.setNegative (true);
    extract.filter (*cloud_filtered);
    
    std::cerr << "Object cloud after filtering: " << std::endl;
    std::cerr << *cloud_filtered << std::endl;
   
    writer.write ("samp11-utm_object.pcd", *cloud_filtered, false);
   
    return (0);
}

你可能感兴趣的:(点云,点云)