搜索
您的当前位置:首页正文

PCL-半径滤波

来源:榕意旅游网

本篇内容

  • 讲解半径滤波的作用
  • 通过pcl实现半径滤波
    效果:

1 主要原理

  • 手动设定半径大小,手动设定点云数量阈值
  • 计算以每个点为原点,半径范围内所有点云数量
  • 若数量小于阈值则删除该点,否则保留

2 主要流程

初始化半径滤波器:

pcl::RadiusOutlierRemoval<pcl::PointXYZ> radius_filter;

设置输入点云:

radius_filter.setInputCloud(cloud);

设置半径大小:

radius_filter.setRadiusSearch(0.05);

设置点云数量阈值:

radius_filter.setMinNeighborsInRadius(10);

执行过滤:

radius_filter.filter(*cloud_filter);

3 完整代码

#include <string>
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/filters/radius_outlier_removal.h>

// 前置点云类型,方便以后更改
using PointType = pcl::PointXYZ;
using PointCloud = pcl::PointCloud<PointType>;
using PointCloud_Ptr = PointCloud::Ptr;

int main(int argc, char **argv) {
  if (argc < 3) {
    std::cout<<"Usage: ./read_pcd <pcd_file_path> <pcd_save_path>\n";
    return -1;
  }

  std::string pcd_file_path(argv[1]);
  std::string pcd_save_path(argv[2]);

  // 声明变量,用于保存点云数据
  PointCloud_Ptr cloud(new PointCloud);
  PointCloud_Ptr cloud_filter(new PointCloud);

  // 读取pcd点云文件
  if (pcl::io::loadPCDFile<PointType>(pcd_file_path, *cloud) == -1) {
    std::cerr<<"check pcd path\n";
    return -1;
  }

  // 初始化过滤器
  pcl::RadiusOutlierRemoval<pcl::PointXYZ> radius_filter;
  // 设置输入点云
  radius_filter.setInputCloud(cloud);
  // 设置半径大小
  radius_filter.setRadiusSearch(0.05);
  // 设置点云数量阈值
  radius_filter.setMinNeighborsInRadius(10);
  // 执行滤波
  radius_filter.filter(*cloud_filter);

  // 保存点云文件
  pcl::io::savePCDFileASCII(pcd_save_path, *cloud_filter);

  return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top