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

PCL 索引空间采样

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 索引空间采样

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

2.2完整代码

三、实现效果


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

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


一、概述

        索引空间采样 是一种点云降采样方法,通过使用点云的索引来选择特定的点进行保留。这种方法灵活且易于实现,适用于需要从点云中提取特定索引点的场景。

1.1原理

        索引空间采样的基本思想是使用点的索引来直接选择要保留的点。例如,可以根据一定的规则(如每隔 n 个点)选择点,或选择特定条件下的点。通过这种方式,可以控制下采样的结果,以达到所需的数据量。

常见的索引方法:

  1. 基于法线或曲率的条件:可以根据法线的方向、曲率等属性选择点。例如,只选择那些法线曲率大于某个阈值的点,以保留重要的几何特征。
  2. 根据空间位置:可以选择在特定区域内的点。例如,只选择在某个坐标范围内的点,或者选择在特定高度以上或以下的点。
  3. 随机选择:可以随机选择点的索引,从而确保样本的多样性。这种方法适用于需要快速采样且不需要特定规则的场景。
  4. 基于点的属性:根据点的颜色、强度或其他属性选择点。例如,选择强度高于某个值的点,以提取出特定特征。
  5. 自定义采样规则:根据应用的具体需求,自定义采样逻辑。例如,可以根据点与某个参考点的距离进行采样,只选择距离较近的点。

1.2实现步骤

  1. 读取点云数据。
  2. 根据索引选择要保留的点。
  3. 可视化原始点云和下采样后的点云。

1.3应用场景

  1. 点云简化:在不影响整体形状的情况下减少点的数量。
  2. 特征提取:提取特定区域或特征的点。
  3. 数据分析:根据索引条件选择样本点进行分析。

二、代码实现

2.1关键函数

2.1.1 索引空间采样

通过使用点云的索引进行降采样。

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.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("Index Space 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("Index Space 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;
}

三、实现效果

相关文章:

PCL 索引空间采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 索引空间采样 2.1.2 可视化原始点云和下采样后的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xf…...

PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(三)

作为“贴代码”力推的一个CRUD实践项目PasteTemplate,在对现有的3个项目进行实战后效果非常舒服&#xff01;下面就针对PasteForm为啥我愿称为最佳CRUD做一些回答: 哪里可以下载这个PasteForm的项目案例 目前“贴代码”对外使用PasteForm的项目有"贴Builder(PasteSpide…...

【无标题】logistic映射

当Logistic映射中的控制参数 μ \mu μ 为负数时&#xff0c;系统的行为与正数 μ \mu μ 的情况截然不同。Logistic映射的一般形式是&#xff1a; x ( t 1 ) μ x ( t ) ( 1 − x ( t ) ) x(t1) \mu x(t) (1 - x(t)) x(t1)μx(t)(1−x(t))其中 x ( t ) x(t) x(t) 表示时…...

基于Node.js+Express+MySQL+VUE科研成果网站发布查看科研信息科研成果论文下载免费安装部署

目录 1.技术选型‌ ‌2.功能设计‌ ‌3.系统架构‌ ‌4.开发流程‌ 5.开发背景 6.开发目标 7.技术可行性 8.功能可行性 8.1功能图 8.2 界面设计 8.3 部分代码 构建一个基于Spring Boot、Java Web、J2EE、MySQL数据库以及Vue前后端分离的科研成果网站&#xff0c;可…...

提升C++代码质量的一些建议

文章目录 1. 命名清晰2. 简洁性3. 一致性4. 注释5. 避免复杂性6. 重构7. 测试8. 错误处理9. 文档10. 代码复用11. 性能优化12. 安全性- 代码规范推荐 C开发中&#xff0c;写出优雅且可维护的代码不仅能提升代码质量&#xff0c;还能提高团队协作效率和项目长期的可扩展性。以下…...

起重机防摇摆技术如何达标-武汉正向科技

武汉正向科技防摇摆控制器 主要技术参数 1、防摇摆精度&#xff1a; 0.4 2、行车到达目标位置偏差位置偏差&#xff1a; 25mm 3、通讯方式&#xff1a;PROFINET / PROFIBUS / RS232 / RS422 / RS485&#xff1b; 4、消除载荷的摇摆达 96% 以上&#xff1b; 5、技术先进…...

[大语言模型-论文精读] MoRAG - 基于多部分融合的检索增强型人体动作生成

MoRAG--Multi-Fusion Retrieval Augmented Generation for Human Motion KS Shashank, S Maheshwari, RK Sarvadevabhatla - arXiv preprint arXiv:2409.12140, 2024 MoRAG - 基于多部分融合的检索增强型人体动作生成 1. 目录 MoRAG--Multi-Fusion Retrieval Augmented Generat…...

解决端口被占用

当你被你的编译器提醒&#xff0c; 当前端口被占用&#xff0c; 但明明你的服务什么的都没有启用&#xff0c;这时有三种解决办法&#xff1a; 1 。 重启 。 重启解决80%的问题 2 。 修改你的端口号 。 3 。 去windows命令行中查看&#xff0c;端口占用情况 第一步 &#xf…...

【递归】7. leetcode 404 左叶子之和

1 题目描述 题目链接&#xff1a;左叶子之和 2 解答思路 递归分为三步&#xff0c;接下来就按照这三步来思考问题 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关系…...

react+antdMobie实现消息通知页面样式

一、实现效果 二、代码 import React, { useEffect, useState } from react; import style from ./style/index.less; import { CapsuleTabs, Ellipsis, Empty, SearchBar, Tag } from antd-mobile; //消息通知页面 export default function Notification(props) {const [opti…...

Git 撤销一个已经push到远端仓库的commit

在 Git 中&#xff0c;撤销一个已经推送到远程仓库的改动有几种不同的方法&#xff0c;具体取决于你是否想要完全删除改动&#xff0c;还是只是恢复文件的某个状态。以下是常见的几种方法&#xff1a; git revert 撤销特定的commit git revert 是最安全的方法&#xff0c;因为…...

lambda表达式底层实现

一、lambda 代码 & 反编译 原始Java代码 假设我们有以下简单的Java程序&#xff0c;它使用Lambda表达式来遍历并打印一个字符串列表&#xff1a; import java.util.Arrays; import java.util.List;public class LambdaExample {public static void main(String[] args) {…...

鸿蒙NEXT开发-组件事件监听和状态管理(基于最新api12稳定版)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…...

《More Effective C++》的学习

引用与指针 没有所谓的null reference reference一定需要代表某个对象&#xff0c;所以C要求reference必须有初值。 QString &s; 使用reference可能比使用pointer更高效。 因为reference一定是有效的&#xff0c;而指针可能为空&#xff08;需要多加一个判断&#xff0…...

Leetcode面试经典150题-322.零钱兑换

给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无限的。 示…...

python17_len()函数

len()函数 A B "" C "hello world" D 18 E 18def len_test(s):try:# 尝试计算字符串的长度length len(s)return lengthexcept TypeError:# 如果不是字符串&#xff0c;则返回 None 或者提示错误return Noneif __name__ "__main__":# 单…...

车视界系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;汽车品牌管理&#xff0c;汽车颜色管理&#xff0c;用户管理&#xff0c;汽车信息管理&#xff0c;汽车订单管理系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;汽车信息&#xff0c;我…...

SQLCMD命令行工具导入数据并生成对应的日志文件

SQLCMD是一个命令行工具,专门用于在Microsoft SQL Server数据库上运行SQL脚本和管理任务。它提供了一种交互式和自动化的方式来执行SQL命令和脚本,并允许用户与SQL Server数据库进行高效的交互。以下是关于SQLCMD的详细介绍: 主要功能 执行SQL脚本: SQLCMD可以执行包含SQL…...

tauri中加载本地文件图片或者下载网络文件图片后存储到本地,然后通过前端页面展示

有一个需求是需要将本地上传的文件或者网络下载的文件存储到本地&#xff0c;并展示在前端页面上的。其实如果只是加载本地文件&#xff0c;然后展示还是挺简单的&#xff0c;可以看我的文章&#xff1a;tauri程序加载本地图片或者文件在前端页面展示-CSDN博客 要想实现上述需…...

QSqlDatabase在多线程中的使用

Qt中多线程使用数据库_qt数据库管理类支持多数据库,多线程-CSDN博客 1. 代码&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError>…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...