PCL 快速均匀下采样

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 快速均匀下采样

2.1.2 可视化原始点云和下采样后的点云

2.2完整代码

三、实现效果


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

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


一、概述

        快速均匀下采样 是一种点云降采样技术,通过设置采样步长来实现等距降采样,从而减少点的数量。用户可以通过指定步长,选择每隔一定数量的点采样一个点,这样可以在保持点云几何特性的同时,显著减少点的数量。

1.1原理

        等距降采样的原理是:通过设置一个固定的步长,遍历原始点云,选择每隔一定数量的点进行保留。这样不仅可以降低数据量,还能保持点云的整体形状和分布。

1.2实现步骤

  1. 读取点云数据。
  2. 使用等距降采样方法,通过指定采样步长选择点。
  3. 可视化原始点云和下采样后的点云。

1.3应用场景

  1. 数据预处理:在大规模点云处理之前减少数据量。
  2. 实时处理:在实时场景中快速处理和分析点云。
  3. 数据分析:在不影响结果的前提下,减少点云的点数。

二、代码实现

2.1关键函数

2.1.1 快速均匀下采样

通过设置采样步长实现等距降采样。

#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>// 设置采样步长
int step_size = 10;  // 每隔十个点采样一个点// 创建新的点云以存储下采样后的结果
pcl::PointCloud<pcl::PointXYZ>::Ptr sampled_cloud(new pcl::PointCloud<pcl::PointXYZ>);// 等距采样
for (size_t i = 0; i < cloud->size(); i += step_size)
{sampled_cloud->points.push_back(cloud->points[i]);  // 添加采样点
}
sampled_cloud->width = sampled_cloud->points.size();
sampled_cloud->height = 1;
sampled_cloud->is_dense = true;  // 确保点云是密集的

2.1.2 可视化原始点云和下采样后的点云

使用 PCLVisualizer 可视化原始点云和下采样后的点云,设置背景为白色。

#include <pcl/visualization/pcl_visualizer.h>// 可视化原始点云和下采样后的点云
void visualizePointClouds(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,  // 原始点云pcl::PointCloud<pcl::PointXYZ>::Ptr sampled_cloud)  // 下采样后的点云
{pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Uniform Sample Viewer"));// 设置视口1,显示原始点云int vp_1;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 PointCloud", 10, 10, "vp1_text", vp_1);  // 标题pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler(cloud, 0, 255, 0);  // 绿色viewer->addPointCloud(cloud, cloud_color_handler, "original_cloud", vp_1);// 设置视口2,显示下采样后的点云int vp_2;viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);  // 右侧窗口viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_2);  // 白色背景viewer->addText("Sampled PointCloud", 10, 10, "vp2_text", vp_2);  // 标题pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> sampled_color_handler(sampled_cloud, 255, 0, 0);  // 红色viewer->addPointCloud(sampled_cloud, sampled_color_handler, "sampled_cloud", vp_2);// 设置点的大小viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original_cloud", vp_1);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "sampled_cloud", vp_2);viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();while (!viewer->wasStopped()){viewer->spinOnce(100);}
}

2.2完整代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>// 可视化原始点云和下采样后的点云
void visualizePointClouds(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,  // 原始点云pcl::PointCloud<pcl::PointXYZ>::Ptr sampled_cloud)  // 下采样后的点云
{pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Uniform Sample Viewer"));// 设置视口1,显示原始点云int vp_1;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 PointCloud", 10, 10, "vp1_text", vp_1);  // 标题pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler(cloud, 0, 255, 0);  // 绿色viewer->addPointCloud(cloud, cloud_color_handler, "original_cloud", vp_1);// 设置视口2,显示下采样后的点云int vp_2;viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);  // 右侧窗口viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_2);  // 白色背景viewer->addText("Sampled PointCloud", 10, 10, "vp2_text", vp_2);  // 标题pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> sampled_color_handler(sampled_cloud, 255, 0, 0);  // 红色viewer->addPointCloud(sampled_cloud, sampled_color_handler, "sampled_cloud", vp_2);// 设置点的大小viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original_cloud", vp_1);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "sampled_cloud", vp_2);/*viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();*/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>("China dragon.pcd", *cloud) == -1){PCL_ERROR("Couldn't read the PCD file!\n");return -1;}// -----------------------------快速均匀下采样---------------------------------pcl::PointCloud<pcl::PointXYZ>::Ptr sampled_cloud(new pcl::PointCloud<pcl::PointXYZ>);  // 存储下采样后的点云// 设置采样步长int step_size = 20;  // 每隔十个点采样一个点// 等距采样for (size_t i = 0; i < cloud->size(); i += step_size){sampled_cloud->points.push_back(cloud->points[i]);  // 添加采样点}sampled_cloud->width = sampled_cloud->points.size();sampled_cloud->height = 1;sampled_cloud->is_dense = true;  // 确保点云是密集的// -----------------------------可视化原始点云和下采样后的点云---------------------------------visualizePointClouds(cloud, sampled_cloud);return 0;
}

三、实现效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1550843.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【有啥问啥】多目标跟踪SORT算法原理详解

多目标跟踪SORT算法原理详解 引言 多目标跟踪&#xff08;Multiple Object Tracking, MOT&#xff09;是计算机视觉领域的一个重要研究方向&#xff0c;广泛应用于视频监控、自动驾驶、人机交互等多个领域。其核心任务是在视频序列中持续、准确地识别和定位多个目标。SORT&am…

数据网格:数据去中心化的特征

在现代的数据管理架构理念中&#xff0c;常常会谈及数据网格&#xff0c;将它用来解决大规模、复杂数据环境下的数据管理和利用问题。本文将探讨数据网格的概念以及数据去中心化和数据网格的紧密联系。 一数据网格 数据网格定义&#xff1a;数据网格将数据视为一种产品&#x…

tailwindcss快速入门(上篇)

tailwindcss 相关链接 演示地址 演示地址 源码地址 源码地址 什么是 Tailwind Tailwind CSS 是一种 实用优先的 CSS 框架&#xff0c;它通过一组预定义的、基于类名的样式帮助开发者快速构建现代化、响应式的用户界面。与传统的 CSS 框架&#xff08;如 Bootstrap&#xf…

只申请一块sizeofimage的内存能否实现PE文件的拉伸

不能,别试了,浪费时间. 从最后一个节复制,也会被覆盖 BOOL StrechFileBuffer(__in char* m_fileName, __inout char** LPImageBuffer) {FILE* file (fopen(m_fileName, "rb"));if (file NULL){printf("error :%d", GetLastError());return FALSE;}// 从文…

工作日志:nvm版本控制遇到的一系列问题。

1、安装vue3可使用的富文本编辑器。&#xff08;https://www.wangeditor.com/v5/for-frame.html#demo-1&#xff09; npm install wangeditor/editor-for-vuenext --save2、为同时拥有两个类的元素设置样式&#xff0c;组合选择器是通过在选择器中并列写入两个类名来实现的&am…

PL3328CD直插DIP7/24W反激式开关电源芯片

PL3328CD 是一系列高效率、高集成度、原边调节的 PWM功率开关&#xff0c;其主要应用于 AC/DC 反激式开关电源。PL3328C通过去除光耦以及次级控制电路&#xff0c;简化了充电器/适配器等传统的恒流/恒压的设计&#xff0c;从而实现高精度的电压和电流调节&#xff0c;调节波形如…

zy85_C#中文件夹操作,Path,以及Environment类

文章目录 1.文件夹的操作1.1Directory类的部分方法1.2程序代码 2.Path2.1Path类的部分字段和方法2.2程序代码 3.Environment3.1Environment类3.2SpecialFolder类3.3程序代码 1.文件夹的操作 1.1Directory类的部分方法 1.2程序代码 try {string path "D:\01";if (D…

leetcode45:跳跃游戏||

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最小…

低空经济时代:无人机飞行安全要点详解

随着低空经济的蓬勃发展&#xff0c;无人机&#xff08;UAV&#xff09;在农业、航拍、物流、应急救援等多个领域的应用日益广泛。然而&#xff0c;无人机的安全飞行不仅关乎任务的成功与否&#xff0c;更直接关系到地面人员、财产及空中交通的安全。本文将从飞行前检查、环境评…

plt.bar函数介绍及实战

目录 plt.bar() 函数实战 plt.bar() 函数 plt.bar() 函数是 Matplotlib 中用于创建柱状图的函数。它用于在图形中绘制一个或多个柱状图&#xff0c;通常用于展示类别型数据的数量或大小的比较。 基本语法&#xff1a; plt.bar(x, height, width0.8, bottomNone, aligncenter…

水波荡漾效果+渲染顺序+简单UI绘制

创建场景及布置 创建新场景Main,在Main场景中创建一个plane物体&#xff0c;命名为WaterWavePla,具体数值及层级面板排布如下&#xff1a; 编写脚本 创建一个文件夹&#xff0c;用于存放脚本&#xff0c;命名Scripts,创建一个子文件夹Effect,存放特效相关脚本&#xff0c;创建…

【Linux 22】生产者消费者模型

文章目录 &#x1f308; 一、生产者消费者模型⭐ 1. 生产者消费者模型的概念⭐ 2. 生产者消费者模型的特点⭐ 3. 生产者消费者模型的优点 &#x1f308; 二、基于阻塞队列的生产消费模型⭐ 1. 阻塞队列概念⭐ 2. 模拟实现基于阻塞队列的生产消费模型 &#x1f308; 三、POSIX 信…

ASP.NET Core 创建使用异步队列

示例图 在 ASP.NET Core 应用程序中&#xff0c;执行耗时任务而不阻塞线程的一种有效方法是使用异步队列。在本文中&#xff0c;我们将探讨如何使用 .NET Core 和 C# 创建队列结构以及如何使用此队列异步执行操作。 步骤 1&#xff1a;创建 EmailMessage 类 首先&#xff0c…

【零基础入门产品经理】学习准备篇 | 需要学一些什么呢?

前言&#xff1a; 零实习转行产品经理经验分享01-学习准备篇_哔哩哔哩_bilibili 该篇内容主要是对bilibili这个视频的观后笔记~谢谢美丽滴up主友情分享。 全文摘要&#xff1a;如何在0实习且没有任何产品相关经验下&#xff0c;如何上岸产品经理~ 目录 一、想清楚为什么…

AIGC教程:如何用Stable Diffusion+ControlNet做角色设计?

前言 对于生成型AI的画图能力&#xff0c;尤其是AI画美女的能力&#xff0c;相信同行们已经有了充分的了解。然而&#xff0c;对于游戏开发者而言&#xff0c;仅仅是漂亮的二维图片实际上很难直接用于角色设计&#xff0c;因为&#xff0c;除了设计风格之外&#xff0c;角色设…

C#知识|基于反射和接口实现抽象工厂设计模式

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 01 应用场景 在项目的多数据库支持上、业务的多算法封装、以及各种变化的业务中&#xff1b; 02 抽象工厂组成 抽象工厂包括抽象产品&#xff08;即业务接口&#xff0c;可以通过抽象类或抽象接口设计&#xff09;…

mfc140u.dll缺失?快速解决方法全解析,解决mfc140u.dll错误

当你的电脑出现找不到mfc140u.dll的问题&#xff0c;不少用户在使用电脑时陷入了困扰。这个错误提示就像一道屏障&#xff0c;阻挡了用户正常使用某些软件。无论是办公软件、游戏还是专业的设计工具&#xff0c;一旦出现这个问题&#xff0c;都会导致软件无法正常运行。如果您也…

mips指令系统简介

**MIPS&#xff08;Microprocessor without Interlocked Piped Stages&#xff09;**&#xff1a;这是一种RISC&#xff08;精简指令集计算&#xff09;芯片架构&#xff0c;由John L. Hennessy设计&#xff0c;特点是没有内部互锁的流水级&#xff0c;简化了处理器设计。 对比…

【WRF工具】cmip6-to-wrfinterm工具概述:生成WRF中间文件

cmip6-to-wrfinterm工具概述 cmip6-to-wrfinterm工具安装cmip6-to-wrfinterm工具使用快速启动&#xff08;Quick start&#xff09;情景1&#xff1a;MPI-ESM-1-2-HR&#xff08;默认&#xff09;&#xff1a;情景2&#xff1a;BCMM情景3&#xff1a;EC-Earth3 更改使用&#x…

【三步 完全离线搭建 openwebui 】

完全离线linux 版open webui 的搭建 1.在具有网络连接的环境中下载whl 在有网络的环境&#xff0c;使用pip download可以保存所有的依赖包,可以使用-i 指定清华的镜像源加速下载速度。 # 命令&#xff1a; pip download <package_name> --only-binary:all: --wheel --…