PCL中的FPS(最远点采样)源码

news2024/12/24 8:22:19

原理:

1.首先,对于三维点云数据,我们一般采取欧式距离度量点之间距离,即空间中两点直线距离。

  2.在对第一个点采样时,理论上我们可以随机从数据中选取一个点。另一种规范的做法是:求整个数据点(点云)的重心(即所有点坐标求和平均得到的坐标点),选取距离重心最远的点,记为P0。

  3. 然后,我们继续选取剩余的所有点中距离P0最远的点,记为P1。

  4. 对于剩下的每个点,分别计算到P0和P1的距离,并选取最短的那个作为这个点到P0,P1整体的距离。计算这些距离后选择距离最大的那个点,记为P2。

  5. 依次重复操作,直到选取所需数目的点。例如:继续选取点,分别计算剩余各点到P0,P1,P2的距离,并选取最短的那个距离作为某点到P1,P2,P3整体的距离,然后选取这些点中距离最大的那个点,记为P3。
原文链接:https://blog.csdn.net/weixin_60737527/article/details/127432708

template<typename PointT> void
 pcl::FarthestPointSampling<PointT>::applyFilter (Indices &indices)
 {
	//获取输入点云的大小(点的数量)。
   const std::size_t size = input_->size();
   //if requested number of point is equal to the point cloud size, copy original cloud
   //如果请求的采样点数与点云的点数相等,则直接将原始索引赋值给输出索引并清空 removed_indices_ (如果存在),然后函数返回。
   if (sample_size_ == size)
   {
     indices = *indices_;
     removed_indices_->clear ();
     return;
   }
   //如果请求的采样点数大于点云的点数,则抛出异常 BadArgumentException。
   //check if requested number of points is greater than the point cloud size
   if (sample_size_ > size)
   {
     PCL_THROW_EXCEPTION (BadArgumentException,
                         "Requested number of points is greater than point cloud size!");
   }
   //创建一个大小为 size 的浮点数向量 distances_to_selected_points,并初始化所有元素的值为 float 类型的最大值。
   std::vector<float> distances_to_selected_points (size, std::numeric_limits<float>::max ());
   
   //set random seed
   //初始化伪随机数生成器 random_gen,并且将生成的随机数限定在 [0, size-1] 的范围内。
   std::mt19937 random_gen(seed_);
   std::uniform_int_distribution<index_t> dis(0, size -1);
  
   //pick the first point at random
   //用随机生成的索引作为起点的索引,将其距离设为 -1.0,并将该索引添加到输出索引 indices 中。
   index_t max_index = dis(random_gen);
   distances_to_selected_points[max_index] = -1.0;
   indices.push_back(max_index);
   //循环从第二个点开始,直到获取到所需采样点数。
   for (std::size_t j = 1; j < sample_size_; ++j)
   {
   //初始化下一个最远点的索引 next_max_index,并获取当前最远点的坐标 max_index_point。
     index_t next_max_index = 0;
     
     const PointT& max_index_point = (*input_)[max_index];
     //recompute distances
	 //计算未选择点到当前最远点的距离,并更新下一个最远点的索引 next_max_index。
     for (std::size_t i = 0; i < size; ++i)
     {
       if (distances_to_selected_points[i] == -1.0)
         continue;
       distances_to_selected_points[i] = std::min(distances_to_selected_points[i], geometry::distance((*input_)[i], max_index_point));
       if (distances_to_selected_points[i] > distances_to_selected_points[next_max_index])
         next_max_index = i;
     }
  
     //select farthest point based on previously calculated distances
     //since distance is set to -1 for all selected elements,previously selected 
     //elements are guaranteed to not be selected
	 //更新最远点的索引为下一个最远点的索引,将该索引添加到输出索引 indices 中,并将其距离设为 -1.0,以确保下一次迭代中不会再选择该点。
     max_index = next_max_index;
     distances_to_selected_points[max_index] = -1.0;
     indices.push_back(max_index);
     //set distance to -1 to ignore during max element search
   }
  //如果提取已移除的点的索引(extract_removed_indices_ 为真),则将未被选择的点的索引添加到 removed_indices_(如果存在) 中。
   if (extract_removed_indices_)
   {
     for (std::size_t k = 0; k < distances_to_selected_points.size(); ++k)
     {
       if (distances_to_selected_points[k] != -1.0)
         (*removed_indices_).push_back(k);
     }
   }
 }

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

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

相关文章

Python2021年12月Python二级 -- 编程题解析

题目一: 日期计算器 设计一款日期计算程序&#xff0c;能否实现下面的功能 (1)要求用户分别输入年、月、日 (分三次输入) ; (2)程序自动会根据输入的年月日计算出这一天是这一年的第几天: (3)输出格式为:这是****年的第**天 请输入某年某月某日&#xff0c;通过编程判断这一天是…

2023-8-31 spfa判断负环

题目链接&#xff1a;spfa判断负环 #include <iostream> #include <cstring> #include <algorithm> #include <queue>using namespace std;const int N 100010;int n, m; int h[N], e[N], w[N], ne[N], idx;int dist[N], cnt[N]; int st[N];void ad…

2023年航空物流行业研究报告

第一章 行业概况 1.1 定义及分类 航空物流行业是一个涉及使用飞机进行货物运输和配送的行业。这个行业包括但不限于航空货运公司&#xff0c;航空公司的货运部门&#xff0c;机场&#xff0c;货运代理&#xff0c;以及提供与航空货运相关的一系列服务的公司&#xff0c;如包装…

【边双】CF Edu10 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; st 到 ed存在多条路径 注意到在同一个边双连通分量中&#xff0c;如果存在一条边的边权是1&#xff0c;那么这个边双连通分量中所有点对的路径中都存在一条边的边权是1&#xff0c;因此我们考虑缩点&#xff0c…

java相关异常大全,持续更新~~~

[Java] 异常 1. NullPointerException NullPointerException是Java中最常见的异常之一&#xff0c;通常在试图访问或操作一个null对象时引发。 示例代码&#xff1a; String str null; int length str.length();解决方法&#xff1a; 在访问或操作对象之前&#xff0c;检…

【C++】使用哈希表模拟实现STL中的unordered_set和unordered_map

文章目录 前言一.哈希表模板改造封装unordered_set和unordered_map1. 哈希表结构修改2. unordered_set和unordered_map增加KeyOfT仿函数3. insert封装及测试4. 哈希表迭代器的实现5. begin和end6. unordered_set和unordered_map的迭代器封装7. unordered_map的[]重载8. 补充完善…

如何解决 Out Of Memory 的问题

背景 在用 Excel Importer 导入数据&#xff0c;当数据量超过 1w 行&#xff0c;经常会出现 OutOfMemory 的错误。&#xff08;用 Excel Exporter 导出数据时&#xff0c;也会有类似问题&#xff09;。 通常的表现症状如下&#xff0c;即在导入成功若干行之后&#xff0c;爆出…

以人工智能手段为依托的:智慧导诊系统源码,提供智能分诊、问病信息等服务

智慧医院3D人体导诊系统源码 开发语言&#xff1a;java 开发工具&#xff1a;IDEA 前端框架&#xff1a;Uniapp 后端框架&#xff1a;springboot 数 据 库&#xff1a;mysql 移 动 端&#xff1a;微信小程序、H5 “智慧导诊”以人工智能手段为依托&#xff0c;为…

9月份抱团学习❗开启报名通道

365天深度学习训练营 大家好&#xff0c;我是K同学啊&#xff01; 一个深度学习领域博主&#xff0c;CSDN的博客专家、有八万粉丝&#xff0c;和鲸特邀导师&#xff0c;《深度学习100例》的作者&#xff0c;一个收到中科院等诸多名校、名企offer的自由摄影爱好者 。 因为经常…

OpenCV

文章目录 OpenCV学习报告读取图片和网络摄像头1.1 图片读取1.2 视频读取1.1.1 读取视频文件1.1.2读取网络摄像头 OpenCV基础功能调整、裁剪图像3.1 调整图像大小3.2 裁剪图像 图像上绘制形状和文本4.1 图像上绘制形状4.2图像上写文字 透视变换图像拼接颜色检测轮廓检测人脸检测…

DP485 具有±15KV ESD 保护,500kbps 通迅速率,256 节点 RS485/RS422 收发器

产品概述&#xff1a; DP485E 是一款 5V 供电、半双工、低功耗、低摆率&#xff0c;完全满足 TIA/EIA-485 标准要求的 RS-485收发器。DP485E包括一个驱动器和一个接收器&#xff0c;两者均可独立使能与关闭。当两者均禁用时&#xff0c;驱动器与接收器均输出高阻态。DP485E具有…

Nacos源码启动 java.net.UnknownHostException: jmenv.tbsite.net

一 概述 Nacos本地源码环境提示&#xff1a; Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat 二 解决方法&#xff1a; 启动增加如下配置&#xff1a; -Dnacos.standalonetrue …

API类型和集成规范指南

在我们的常见应用中&#xff0c;往往包含着大量服务于各种数据交换的API类型、以及各种常见的API架构与协议。下面&#xff0c;我将从集成的角度和您讨论&#xff0c;在准备将多个服务相互集成时&#xff0c;使用不同类型、架构和协议的API意味着什么?我们可以使用哪些工具&am…

日本排核污水:有人2天赚了800万

来谈1个非常夸张的事&#xff0c;有人2天用它搞了800多万&#xff0c;这一波完全震惊我和小伙伴&#xff0c;哪位兄弟老哥有货和资源的抓紧去搞&#xff0c;这波红利能持续好一段时间。 24号中午发生了件大事件&#xff0c;让所有人都气愤&#xff01;流量巨大&#xff0c;不管…

Python正则表达式简单教程

当涉及到处理文本数据时&#xff0c;正则表达式是一个非常有用的工具。它可以用于在字符串中进行模式匹配、搜索、替换等操作。以下是一个简单的Python正则表达式教程&#xff0c;从基础开始介绍如何使用正则表达式。 什么是正则表达式&#xff1f; 正则表达式&#xff08;Re…

nextTick不能获取到图片的宽高度

nextTick方法本身并不能直接获取图片的宽高度&#xff0c;它只是用于在下次DOM更新循环结束后执行回调函数。要获取图片的宽高度&#xff0c;需要在回调函数中使用其他方法来获取。 一种常见的方法是使用Image对象来加载图片&#xff0c;并在加载完成后获取图片的宽高度。可以…

01JVM_内存结构

一、什么是JVM 1.JVM的定义 Java程序的运行环境&#xff0c;java二进制字节码的运行环境 2.JVM的好处 ①一次编写&#xff0c;到处运行 ②自动内存管理&#xff0c;垃圾回收功能 ③数组下标越界检查 ④多态 3.jvm&#xff0c;jre&#xff0c;jdk的比较 3.常见的JVM 主…

Windows下Git Bash调用rsync

rsync 提供了补充只需要在git安装目录下放入对应的文件即可。 需要将这个三个文件放到git的bin目录下 如果是默认安装路径是如下&#xff1a; C:\Program Files\Git\usr\bin 然后大功告成。

软件测试Day3|软件测试理论01

目录 1.缺陷1.1 定义1.2 缺陷由来 2. 软件测试的定义和目的2.1 软件测试定义2.2 软件测试目的 3. 软件开发模型3.1 生命周期3.2 瀑布模型3.3 螺旋模型3.4 迭代模型3.5 敏捷开发模型-scrum3.6 增量模型3.7 快速原型模型 4. 软件测试流程和模型4.1 软件测试工作流程4.2 软件测试模…

【AntV】canvas表格s2完全封装手册

前言 由于我们业务中有很多地方需要有纵向复制,刷选等操作,一般的传统表格并不支持。 目前支持度较好的葡萄城表格与handsontable都需要收费,而s2作为一款轻量级开源表单较为符合我们的需求,但是由于s2仍然不够成熟,有非常多的功能需要自定义。 我在公司对s2做了大量封…