当前位置: 首页 > article >正文

PCL GridMinimum获取栅格最低点

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 GridMinimum 栅格最低点提取

2.1.2 可视化函数

2.2完整代码

三、实现效果


PCL点云算法汇总及实战案例汇总的目录地址链接:

PCL点云算法与项目实战案例汇总(长期更新)


一、概述

        PCL GridMinimum 滤波器是用于从点云中提取栅格中最低点的一个操作。它将点云划分为规则的网格单元,并从每个网格中选择最低的点作为输出,常用于简化点云数据、减少噪声,或者在地形数据处理中保留最低的地面点。

1.1原理

        GridMinimum 滤波器的原理是将点云划分成多个网格,然后对每个网格内的点进行比较,保留 Z 坐标最小的点(即最低点)。这有助于在处理不规则地形或存在噪声的点云时提取出更有代表性的点。整个过程可分为以下步骤:

  1. 定义每个栅格的尺寸。
  2. 在每个栅格中找到 Z 轴方向最低的点。
  3. 输出保留最低点的点云。

1.2实现步骤

  1. 加载点云数据。
  2. 使用 GridMinimum 设置栅格尺寸。
  3. 滤波并保留栅格中最低的点。
  4. 可视化滤波前和滤波后的点云。

1.3应用场景

  1. 地形简化:在处理地形数据时,提取栅格中最低的点以获取地面特征。
  2. 噪声去除:通过选择最低点来去除可能的悬浮物或噪声点。
  3. 数据压缩:减少点云数据量,同时保留地面或低层次信息。

二、代码实现

2.1关键函数

2.1.1 GridMinimum 栅格最低点提取

利用 GridMinimum 实现栅格内最低点的提取操作。

#include <pcl/filters/grid_minimum.h>

// 获取栅格最低点
void applyGridMinimumFilter(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr& filtered_cloud, float resolution)
{
    // 创建GridMinimum滤波器对象
    pcl::GridMinimum<pcl::PointXYZ> grid_minimum;
    grid_minimum.setInputCloud(cloud);  // 设置输入点云
    grid_minimum.setResolution(resolution);  // 设置栅格的分辨率
    grid_minimum.filter(*filtered_cloud);  // 执行滤波并获取最低点
}

2.1.2 可视化函数

将滤波前和滤波后的点云显示在同一窗口的两个视口中,方便直观比较效果。

// 可视化点云数据
void visualizePointClouds(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr& filtered_cloud)
{
    // 创建PCLVisualizer对象
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Grid Minimum Viewer"));

    // 设置第一个视口,显示原始点云
    int vp_1, vp_2;
    viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);
    viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);
    viewer->addText("Original Point Cloud", 10, 10, "vp1_text", vp_1);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler(cloud, 255, 0, 0);  // 设置为红色
    viewer->addPointCloud(cloud, cloud_color_handler, "original_cloud", vp_1);
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original_cloud");  // 设置原始点云大小

    // 设置第二个视口,显示滤波后的点云
    viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);
    viewer->setBackgroundColor(0.98, 0.98, 0.98, vp_2);
    viewer->addText("Filtered Point Cloud", 10, 10, "vp2_text", vp_2);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> filtered_color_handler(filtered_cloud, 0, 255, 0);  // 设置为绿色
    viewer->addPointCloud(filtered_cloud, filtered_color_handler, "filtered_cloud", vp_2);
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "filtered_cloud");  // 设置滤波后点云大小

    viewer->addCoordinateSystem(1.0);

    // 循环显示直到窗口关闭
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
    }
}

2.2完整代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/grid_minimum.h>
#include <pcl/visualization/pcl_visualizer.h>

// 获取栅格最低点
void applyGridMinimumFilter(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr& filtered_cloud, float resolution)
{
    // 创建GridMinimum滤波器对象并传入分辨率
    pcl::GridMinimum<pcl::PointXYZ> grid_minimum(resolution);
    grid_minimum.setInputCloud(cloud);  // 设置输入点云
    grid_minimum.filter(*filtered_cloud);  // 执行滤波并获取最低点
}

// 可视化点云数据
void visualizePointClouds(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr& filtered_cloud)
{
    // 创建PCLVisualizer对象
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Grid Minimum Viewer"));

    // 设置第一个视口,显示原始点云
    int vp_1, vp_2;
    viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);
    viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);
    viewer->addText("Original Point Cloud", 10, 10, "vp1_text", vp_1);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler(cloud, 255, 0, 0);  // 设置为红色
    viewer->addPointCloud(cloud, cloud_color_handler, "original_cloud", vp_1);
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original_cloud");  // 设置原始点云大小

    // 设置第二个视口,显示滤波后的点云
    viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);
    viewer->setBackgroundColor(0.98, 0.98, 0.98, vp_2);
    viewer->addText("Filtered Point Cloud", 10, 10, "vp2_text", vp_2);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> filtered_color_handler(filtered_cloud, 0, 255, 0);  // 设置为绿色
    viewer->addPointCloud(filtered_cloud, filtered_color_handler, "filtered_cloud", vp_2);
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "filtered_cloud");  // 设置滤波后点云大小

    viewer->addCoordinateSystem(1.0);

    // 循环显示直到窗口关闭
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
    }
}

int main(int argc, char** argv)
{
    // -----------------------------读取点云数据---------------------------------
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("data.pcd", *cloud) < 0)
    {
        PCL_ERROR("点云文件不存在");
        return -1;
    }

    // 输出原始点云数据大小
    std::cout << "原始点云个数:" << cloud->points.size() << std::endl;

    // -----------------------------执行栅格最低点滤波----------------------------
    pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>);
    float resolution = 0.1f;  // 设置栅格分辨率
    applyGridMinimumFilter(cloud, filtered_cloud, resolution);

    // 输出滤波后点云数据大小
    std::cout << "滤波后点云个数:" << filtered_cloud->points.size() << std::endl;

    // -----------------------------可视化结果-----------------------------------
    visualizePointClouds(cloud, filtered_cloud);

    return 0;
}

三、实现效果


http://www.kler.cn/news/327432.html

相关文章:

  • 无人机在抗洪方面的作用!
  • 傅里叶变换(对称美)
  • 【JAVA高级】如何使用Redis加锁和解锁(一)、Lua脚本执行原理及流程
  • 引入Scrum激发研发体系活力
  • MySQL | 窗口函数
  • 信安 实验1 用Wireshark分析典型TCP/IP体系中的协议
  • 8. Bug 与 Error
  • SpringBoot2(Spring Boot 的Web开发 springMVC 请求处理 参数绑定 常用注解 数据传递 文件上传)
  • 去中心化自治组织(DAO)
  • JDK9与JDK8对比
  • Redis: 主从复制故障分析及解决方案
  • [Cocoa]_[初级]_[绘制文本如何设置断行方式]
  • 【星海saul随笔】Ubuntu基础知识
  • 构建高效的足球青训后台:Spring Boot应用
  • Web3.0 应用项目
  • 【网络安全 | 渗透工具】自动化 .env/.git文件检测
  • 【Linux 从基础到进阶】Spark 大数据计算引擎使用
  • React表单:formik、final-form和react-hook-form
  • PHP反序列化5(回调函数call_user_func_array)
  • 计算机毕业设计python+spark知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习
  • C#核心(3)类中的成员变量和访问修饰符
  • Oracle 闪回版本(闪回表到指定SCN)
  • 袋鼠云数据资产平台:数据模型标准化建表重构升级
  • 【YashanDB知识库】客户端字符集与数据库字符集兼容问题
  • 基于ESP8266—AT指令连接阿里云+MQTT透传数据(1)
  • Ceph RocksDB 深度调优
  • 韦东山FreeRTOS笔记
  • 1.7 编码与调制
  • Ubuntu上安装Miniconda并自定义环境存储路径
  • 什么是嵌入式?行业前景如何?