点云的降采样

news2024/11/18 0:29:42

1. 点云深度学习中的新下采样方法 (CSDN)

现在比较常见的下采样算法有:farthest point sampling(PointNet++,ShellNet)、random sampling(RandLA-Net)、grid sampling(KPConv,Grid-GCN)等。它们各有特点:

farthest point sampling(FPS):采样点分布均匀,时间复杂度高 (Farthest Point Sampling in 3D Object Detection) ((FPS)算法核心思想解析) (Fast Marching farthest point sampling) (图解点云深度学习中FPS–最远点采样算法)

grid sampling(GS):采样点分布较为均匀,时间复杂度一般,采样点个数具有不确定性

random sampling(RS):采样点分布具有随机性,时间复杂度低

(1) Adaptive Hierarchical Down-Sampling (CVPR2020) (arxiv)
a. Critical Points Layer (CPL)
b. Weighted Critical Points Layer (WCPL)

(2) Adaptive Sampling (CVPR2020) (arxiv)
首先利用FPS进行采样,然后根据利用KNN获取邻域点,之后对k个邻域点进行自适应加权(attention的思想,权重的计算是直接对每个点应用MLP),求取加权平均值即为新的关键点。这种方式提升了对噪声点的鲁棒性,同时将邻域的几何空间特征引入到了采样过程中。

2. LiDAR 360 点云重采样方法 (LiDAR 360)
最小点间距(默认,默认为“0.0000”):用户需要设置两点之间的最小点间距,这样采样后的点云任意两个点之间空间三维的最小距离不会小于该值。设置的值越大,保留的点越少。

采样率(默认为“99.99%”):需要用户设置保留点数的百分比,在此模式下,LiDAR360会随机的保留指定的点数。保留的点数 = 总点数 * 采样率。该参数的取值范围为0 - 100%,设置的值越小,保留的点越少。

八叉树(Octree)(默认为21):该模式允许用户选择一种“八叉树”的细分级别,在这个级别上,对于每个八叉树的细胞中,将会保留最接近于八叉树细胞中心的位置点。范围:1~21。设置的值越小,保留的点越少。

3. MATLAB 点云降采样方法 (pcdownsample)
ptCloudOut = pcdownsample(ptCloudIn,‘random’,percentage) random 返回具有随机采样且不替换的降采样点云。百分比输入指定要返回到输出的输入部分。 (可以动态调整采样率,输出特定点数N的采样数据)

ptCloudOut = pcdownsample(ptCloudIn,‘gridAverage’,gridStep) gridAverage 使用网格过滤器返回下采样点云。 gridStep 输入指定一个3D box的大小。(迭代采样间隔,可以获得>=最小采样点数N的采样结果)

ptCloudOut = pcdownsample(ptCloudIn,‘nonuniformGridSample’,maxNumPoints) nonuniformGridSample 使用非均匀盒网格滤波器返回下采样点云。必须在网格框中设置最大点数,maxNumPoints最小设置为6. (参数maxNumPoints从最小值6开始累加,找到输出的采样点云数为目标个数N时停止迭代,导出结果)

4、通过其他聚类算法实现点云降采样 (scikit-learn)
K-Means (K-Means聚类算法(一):算法思路(zhihu))
用人话讲明白快速聚类kmeans (zhihu)
点云聚类 (Tophat 观察 / PointCloudTutorial)
回波强度约束下的无人机LiDAR点云K-means聚类滤波 (地球信息科学学报)
K-Means聚类算法原理与实现 (前端矿场)

  1. DBSCAN algorithm identifies the dense region
    DBSCAN algorithm identifies the dense region by grouping together data points that are closed to each other based on distance measurement.
    DBSCAN Clustering Algorithm in Machine Learning (kdnuggets)
    Clustering with DBSCAN, Clearly Explained!!! (youtube)
    DBSCAN Algorithm Clustering in Python (section)

  2. Random Sample Consensus (RANSAC) algorithm
    Parallel-RANSAC (github)
    Parallel RANSAC: Speeding up plane extraction in RGBD image sequences using GPU

  3. GeometryHub
    点云采样的方法有很多种,常见的有均匀采样,几何采样,随机采样,格点采样等。

1 概述
三维点云往往包含大量冗余数据,直接处理计算量大,消耗时间长,因此对其进行降采样是十分必要的。降采样同时也是点云预处理过程中的关键环节。

2 常用方法
2.1 体素网格下采样
2.1.1 原理
体素(Voxel):将三维空间划分成一个个立体的方格,每个方格就叫一个体素。
在这里插入图片描述

在每个体素中可能存在几个点,也可能没有点。降采样的思路为:检查每个体素中是否有点存在,若有,则用一个点代替体素内的点集,通常,这个采样点可以是体素中所有点坐标的平均值(质心),也可以是中心点或者离中心点最近的点。

2.1.2 流程
计算点云的包围盒,将包围盒离散成小体素。体素的长宽高尺寸可以通过用户设定,也可以指定三个方向上的体素个数;
获取落在每个体素中的点集,在每个体素中取一个采样点代替原来的点集。

2.1.3 特点
效率高
采样点分布比较均匀
可以通过控制体素大小间接控制采样点的距离(采样后点云的稀疏程度)
采集到的点云数量不可控

2.2 均匀下采样
2.2.1 原理
均匀下采样有多种不同的采样方式。

类似体素网格采样,同样需要将点云空间划分,不同的是,在均匀采样中是以半径为r的球体。选取距离球体中心最近的点作为采样点替代落在球体中的点集,此时,采样点的坐标为源点云中一点的坐标,不同于体素下采样中使用质心进行替代而产生新的点坐标。可以修改球体半径r,实现对采样点云稀疏程度的控制。

均匀采样是指每隔固定的点数采样一次。样本按点的顺序执行,始终选择从第 1 个点开始,而不是随机选择。显然点存储的顺序不同,得到的结果也会不一样。从这个角度来看,这种方法比较适合有序点云的降采样。这种方法适合均匀采集到的点云,如果点云本身不均匀,那么以固定点数采样很有可能造成某一部分的点云没被采样到。相比于体素的采样方法,点云均匀采样后的点数是固定可控的,而体素采样后的点云数量是不可控的。

最远点采样是较为简单的一种,首先需要选取一个种子点,并设置一个内点集合,每次从点云中不属于内点的集合找出一点距离内点最远的点,如下图,这里的距离计算方式为该点至内点所有点的最小距离。这种方式的下采样点云分布均匀,但是算法复杂度较高效率低。

2.2.2 特点
分布很均匀
不会移动源点云,准确度较高
时间复杂度偏高。可以采用分治的方法提高效率

2.3 几何采样(曲率下采样)
2.3.1 原理

以点云的几何特征作为采样依据,以曲率为例。在点云中任意一点都存在某曲面,曲率示意图如下所示(密切圆半径r的倒数为曲率),曲率越大,弧的弯曲程度越大,表示该地方的特征点越多,故在点云曲率越大的地方,采样点数越多。

在这里插入图片描述
2.3.2 流程
1)首先计算每个点的K领域,然后计算点到领域点的法线夹角值,以此来近似达到曲率的效果并提高计算效率,因为曲率越大的地方,夹角值越大。

2)设置一个角度阈值,当点的领域夹角值大于阈值时被认为是特征明显的区域,其余区域为不明显区域。

3)对明显和不明显区域进行均匀采样,采样数分别为U ( 1 − V ) 和 U V UV UV, U U U是目标采样数,V是均匀采样性。

2.3.3特点
几何特征越明显的区域,采样个数分布越多(曲率越大,采样点数越多)
效率高
采样点局部均匀分布
稳定性高:通过几何特征区域的划分,使得采样结果抗噪性更强

2.4 随机下采样
原理简单,顾名思义,指定采样点个数,进行随机点去除进行采样操作。
2.4.1 特点
能控制采样点个数
随机性太强
3 PCL 下采样实践
3.1 体素网格下采样
在PCL库中,我们可以使用pcl::VoxelGridpcl::PointXYZ将空间点云体素化,得到对应的体素网格,再进行体素下采样。

关键代码:
*pcl::VoxelGridpcl::PointXYZ sor; // 体素化网格
sor.setInputCloud(cloud);
sor.setLeafSize(0.01f, 0.01f, 0.01f); // 设置体素栅格的大小为 1x1x1cm
sor.filter(cloud_filtered);

测试代码如下:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>

int main(int argc, char** argv)
{
    //pcl::PCLPointCloud2::Ptr cloud(new pcl::PCLPointCloud2());
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    //pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
    // Fill in the cloud data
    pcl::PCDReader reader;
    // Replace the path below with the path where you saved your file
    reader.read("table_scene_lms400.pcd", *cloud); // Remember to download the file first!

    std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height
        << " data points (" << pcl::getFieldsList(*cloud) << ").";

    // Create the filtering object
    pcl::VoxelGrid<pcl::PointXYZ> sor;
    sor.setInputCloud(cloud);
    sor.setLeafSize(0.01f, 0.01f, 0.01f);
    sor.filter(*cloud_filtered);

    std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height
        << " data points (" << pcl::getFieldsList(*cloud_filtered) << ").";

    //pcl::PCDWriter writer;
    //writer.write("table_scene_lms400_downsampled.pcd", *cloud_filtered,
        //Eigen::Vector4f::Zero(), Eigen::Quaternionf::Identity(), false);

    pcl::visualization::PCLVisualizer viewer("demo");
    int v1(0);
    int v2(1);
    viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1); 
    viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);
    // The color we will be using
    float bckgr_gray_level = 0.0;  // Black
    float txt_gray_lvl = 1.0 - bckgr_gray_level;

    // Original point cloud is white
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_in_color_h(cloud, (int)255 * txt_gray_lvl, (int)255 * txt_gray_lvl, (int)255 * txt_gray_lvl);
    viewer.addPointCloud(cloud, cloud_in_color_h, "cloud_in_v1", v1);       //viewer.addPointCloud(cloud_in, cloud_in_color_h, "cloud_in_v2", v2);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_green(cloud_filtered, 20, 180, 20);
    viewer.addPointCloud(cloud_filtered, cloud_out_green, "cloud_out", v2); 
    viewer.setBackgroundColor(bckgr_gray_level, bckgr_gray_level, bckgr_gray_level, v2);     
    viewer.setSize(1280, 1024);  // Visualiser window size
    //viewer.showCloud(cloud_out);
    while (!viewer.wasStopped())
    {
        viewer.spinOnce();
    }
    return (0);
}

3.2 均匀下采样
对点云数据创建一个三维体素栅格,然后取每个体素中最接近体素中心的点,代替体素中所有点。

// Uniform sampling object
pcl::UniformSampling<pcl::PointXYZ> filter;		// 创建均匀采样对象
filter.setInputCloud(cloud);					// 设置待采样点云
filter.setRadiusSearch(0.01f);					// 设置采样半径
filter.filter(*cloud_filtered);					// 执行均匀采样,结果保存在cloud_filtered中

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

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

相关文章

JUC并发编程之LinkedBlockingQueue的底层原理

作者简介&#xff1a;专注于研究Linux内核、Hotspot虚拟机、汇编语言、JDK源码、各大中间件源码等等喜欢的话&#xff0c;可以三连关注~LinkedBlockingQueue介绍在JUC包下关于线程安全的队列实现有很多&#xff0c;那么此篇文章讲解LinkedBlockingQueue的实现原理&#xff0c;相…

LeetCode 刷题系列 -- 1026. 节点与其祖先之间的最大差值

给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。&#xff08;如果 A 的任何子节点之一为 B&#xff0c;或者 A 的任何子节点是 B 的祖先&#xff0c;那么我们认为 A 是 B 的…

The Social Life of Autonomous Cars-自动驾驶汽车与日常生活

目录 自动驾驶汽车与日常生活 Abstract REPURPOSING ONLINE VIDEOS THE SOCIAL ROAD SEEING A GAP AS JUST A GAP SOMETIMES IT’S GOOD TO BE A CREEP THE UNCANNY VALLEY OF AUTONOMOUS CARS References 自动驾驶汽车与日常生活 作者Barry Brown时间06 February 201…

【智慧电力巡检】基于EasyCVR视频技术构建远程监控综合管理平台

一、方案背景电力行业和人民的生活、生产息息相关&#xff0c;一旦电力设施遭遇破坏或工作失误&#xff0c;就会造成大面积停电&#xff0c;其后果不堪设想&#xff0c;尤其是2003年美加“8.14”和2005年莫斯科“5.25”这两起大面积停电事故给我们敲响了警钟。随着电力行业的发…

zookeeper源码分享六 ---- 事物日志

二进制格式设计思想 在二进制格式设计中&#xff0c;其实和json的格式设计类似&#xff0c;也是有套路的。 设计要存储的内容(内容尽可能少&#xff0c;能用数字表示&#xff0c;不用字符串表示)。这些内容的前后顺序&#xff0c;读写都是按照这个顺序来的。 比如&#xff1…

来看看这几个办公技巧吧

技巧一&#xff1a;重复运行命令 当我们需要将一段中的不同单词加粗时&#xff0c;使用替换功能可能不是特别方便。这时可以使用万能的【F4】键进行重复操作。首先选中一个需要加粗的字&#xff0c;点击【加粗】设置完成字体的加粗&#xff1b;然后&#xff0c;选择另一个文本&…

1、python框架selenium

分层的自动化测试 什么样的产品适合做自动化测试&#xff1f; 功能成熟&#xff08;需求变动较小&#xff09; 产品更新维护周期长 项目进度不太大 比较频繁的回归测试 软件开发比较规范&#xff0c;具有可测试性 可以脚本具有可复用性 selenium 技术&#xff1a; 元素定位的…

[基础语法] python语法之列表、判断、循环例子

文章目录购物车案例已发布&#xff1a;整体框架打印商品列表将商品加入购物车打印购物车、计算总金额完整代码另外说明购物车案例 已发布&#xff1a; python判断语句python循环语句python之列表list购物车案例后续暂时不更新&#xff0c;有想要的部分&#xff0c;可以后台留…

11、Servlet——综合案例(Servlet+JDBC):管理员登录

目录 1、在MySQL中新建一个servletdatabase数据库&#xff0c;创建表admin 2、在web中创建登录页面login.html 3、在web中创建CSS文件夹&#xff0c;在CSS文件夹中创建login.css 4、在web下新建注册页面register.html 5、在CSS文件夹中新建register.css 6、在CSS文件夹下新…

文件包含漏洞

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 01 文件包含漏洞概述 简单例子 PHP中的文件包含函数 02 文件包含漏洞类型及利用 本地文…

基于MATLAB的车牌识别系统设计

基于MATLAB的车牌识别系统设计 摘要 随着公路逐渐普及&#xff0c;我国的公路交通事业发展迅速&#xff0c;所以人工管理方式已经不能满着实际的需要&#xff0c;微电子、通信和计算机技术在交通领域的应用极大地提高了交通管理效率。汽车牌照的自动识别技术已经得到了广泛应…

弱网测试利器-Charles工具实战

一&#xff1a;弱网测试要点 二&#xff1a;利用抓包工具charles进行弱网设置&#xff0c;适用PC端和移动端&#xff08;IOS&#xff0f;Android&#xff09; 1、以charles 4.5.6版本为例&#xff0c;打开Proxy->Throttle Settings 2、打开Throttle Settings&#xff0c;界…

实战详细讲解Qt插件plugin的编写与用法

目录 1.Qt的插件是什么&#xff1f;优点是什么&#xff1f; 2.实战项目需求 3. 程序设计分析 4.Qt插件的编写 Q_DECLARE_INTERFACE&#xff08;类名&#xff0c;标识符&#xff09; Q_INTERFACES 5.插件的调用 总结感言&#xff1a; 1.Qt的插件是什么&#xff1f;优点是…

let/const相关的内容(一)

1.let/const的基本使用 在ES5中我们声明变量都是使用的var关键字(variable的缩写)&#xff0c;从ES6开始新增了两个关键字可以声明变量&#xff1a;let、const。 let和const在其他编程语言中都是有的&#xff0c;所以并不是新鲜的关键字&#xff0c;但是他们确实给JS带来了不一…

动态规划设计LeetCode 300. 最长递增子序列 354. 俄罗斯套娃信封问题

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 300. 最长递增子序列 354. 俄罗斯套娃信封问题&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434…

【openGauss】把应用开发中的设置客户端字符编码往细了说

前言 早前写过两篇有关Oracle字符集的文章 【ORACLE】谈一谈Oracle数据库使用的字符集,不仅仅是乱码 【ORACLE】谈一谈NVARCHAR2、NCHAR、NCLOB等数据类型和国家字符集 基本说明了 ”数据字符编码“、”客户端字符编码“、”数据库字符编码“三者的关系&#xff0c;这些关系&a…

磨金石教育摄影技能干货分享|年味就是幸福圆满的味道

时光荏苒&#xff0c;时代变迁。以前是古街古巷&#xff0c;现在是高楼大厦。以前的老街&#xff0c;灯笼满街&#xff0c;烟火气十足。现在的城市商业街中霓虹灯可以展示出各种新年的影像。无论时代如何变迁&#xff0c;无论时光走了多远&#xff0c;我们对春节的期待从未改变…

吴恩达机器学习(二)——机器学习之监督模型之回归模型之线性回归模型

y-hat一般指的就是预测值 线性回归模型实例 构建模型 我们有一个房子的大小size&#xff0c;得到房屋价格&#xff08;price&#xff09;&#xff0c;通过这两个常数就可计算一个输入和输出的函数关系。 f w&#xff0c;b(x(i)) wx(i) b i指的是第几个训练数据 评估模型——…

【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用

【教程】browsermob-proxy 基于Java的代理服务 配合selenium使用 配置依赖 <!-- 代理 配合 selenium进行抓包修改等 --><dependency><groupId>net.lightbody.bmp</groupId><artifactId>browsermob-core</artifactId><version>2.1.5&…

H3C Switch S1848G端口限速

需求&#xff1a;在交换机层面对接入用户的网络流量限速1.交换机信息2.主机限速前2.1本机IP和MAC信息依次打开控制面板\所有控制面板项\网络连接2.2限速前测速使用浏览器打开https://10000.gd.cn/测速3.主机限速后3.1查看主机所在交换机接口点击“网络”-“MAC地址”&#xff0…