pcl中ransac提取直线_pcl学习笔记1

本文介绍了PCL(Point Cloud Library)的基本概念与使用方法,涵盖了点云数据结构、滤波处理、特征描述提取等内容,适合初学者入门学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    文 | 云师弟   源 | 云师弟   编 | 云师弟

文仅交流,如侵联删

点击上方“云师弟的学习空间”,关注"星标"

获取有趣、好玩的前沿干货!

3d3671d5e5c8e80797345e4dc38be95d.png

PCL(The Point Cloud Library)是用于2D / 3D图像和点云处理的大规模开放项目。开源软件。它是免费的,可用于商业和研究用途。PCL是跨平台的,并且已成功编译并部署在Linux,MacOS,Windows和Android上。点云是用于表示多维点集合的数据结构,通常用于表示三维数据。在3D点云中,这些点通常代表基础采样表面的X,Y和Z几何坐标。存在颜色信息时,点云变为4D。

① :点云库中的重要模块库

pcl模块库简介

pcl_filters库(模块过滤器)包含异常值和用于3D点云数据进行滤波应用噪声去除机制。 pcl_features库包含的数据结构和机制,从点云数据3D功能估计。 pcl_keypoints库包含两个点云的关键点检测算法实现。关键点(也称为兴趣点)是图像或点云中稳定,独特且可以使用定义明确的检测标准进行识别的点。 pcl_registration库实现组织无组织(一般用途)的数据集的点云配准算法两者过多。 pcl_kdtree库提供了kd树的数据结构,使用pcl_octree库提供用于创建从点云数据的分层树数据结构的有效方法。这样就可以对点数据集进行空间分区,下采样和搜索操作。每个八叉树节点有八个子节点或没有子节点。根节点描述了一个包围所有点的三次边界框。在每个树级别,此空间都会被2细分,这会导致体素分辨率提高。 pcl_segmentation库包含用于分割点云成不同的集群算法。这些算法最适合处理由多个空间隔离区域组成的点云。在这种情况下,群集通常用于将云分解成其组成部分,然后可以对其进行独立处理 pcl_sample_consensus图书馆拿着样品共识(SAC)方法,如RANSAC和模型,如平面和圆柱。这些可以自由组合以检测点云中的特定模型及其参数。 pcl_surface库处理与三维扫描重建原始曲面。根据当前的任务,例如可以是船体,网格表示或具有法线的平滑/重采样表面。 pcl_io库包含用于从各种传感装置的读取和写入点云数据(PCD)的文件,以及捕获的点云的类和函数。 pcl_visualization图书馆建为能够快速原型和可视化的三维点云数据操作的算法结果的目的。 基本数据类型

PCL中的基本数据类型是PointCloud

cloud.width宽度有两个含义:

① 它可以指定点的云中的总数(等于与元件的数量的点-见下文),用于无组织的数据集;

② 它可以指定组织的点云数据集的宽度(一行中的总点数)。

一个有组织的点云数据集是赋予类似于一个有组织的图像(或矩阵)状的结构,其中,数据被划分为行和列。有组织的数据集的优点在于,通过了解相邻点(例如像素)之间的关系,最近邻居操作会更加高效,从而加快了计算速度并降低了PCL中某些算法的成本。

可投影点云数据集是赋予点云的名称,这些点云根据针孔相机模型在有组织的点云中的点的(u,v)索引与实际3D值之间具有相关性。这种相关性可以用最简单的形式表示为:u = f * x / z和v = f * y / z

cloud::high高度有两个含义:

① 它可以指定组织的点云数据集的高度(总行数);

② 对于无组织的数据集,将其设置为1(从而用于检查数据集是否已组织)。

pcl::PointCloud<:pointxyz>cloud;

(std :: vector)包含存储所有PointT类型的所有点的数据数组

std::vector<:pointxyz>data = cloud.points;

:PCL:`is_dense` (布尔)

指定点中的所有数据是否为有限(true),或某些点的XYZ值是否可能包含Inf / NaN值(false)。

:pcl:`sensor_origin_`(Eigen :: Vector4f)

指定传感器采集姿势(原点/平移)。该成员通常是可选的,并且在PCL中的大多数算法中都不使用。

:pcl:`sensor_orientation_`(Eigen :: Quaternionf)

指定传感器采集姿势(方向)。该成员通常是可选的,并且在PCL中的大多数算法中都不使用。

从PCD文件写入和读取点云数据

从PCD文件写入和读取点云数据:https://www.cnblogs.com/li-yao7758258/p/6435568.html

可视化&背景颜色&背景文字:

https://www.cnblogs.com/baby123/p/10950907.html

连接两个点云中的字段或数据形成新点云以及Opennni Grabber初识:

https://www.cnblogs.com/li-yao7758258/p/6435759.html

(1)学习如何连接两个不同点云为一个点云,进行操作前要确保两个数据集中字段的类型相同和维度相等,同时了解如何连接两个不同点云的字段(例如颜色 法线)这种操作的强制约束条件是两个数据集中点的数目必须一样,例如:点云A是N个点XYZ点,点云B是N个点的RGB点,则连接两个字段形成点云C是N个点xyzrgb类型。新建文件pcl02_concatenate_clouds.cpp

(2)字段间连接是在行的基础后连接,而点云连接是在列的下方连接,最重要的就是要考虑维度问题,同时每个点云都有XYZ三个数据值。

kd-tree和滤波

kd-tree理论以及在PCL 中的代码的实现

https://www.cnblogs.com/li-yao7758258/p/6437440.html

点云数据处理中最为核心的问题就是建立离散点间的拓扑关系,实现基于邻域关系的快速查找。

k-d树 (k-dimensional树的简称),是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。K-D树是二进制空间分割树的特殊的情况。用来组织表示K维空间中点的几何,是一种带有其他约束的二分查找树,为了达到目的,通常只在三个维度中进行处理因此所有的kd_tree都将是三维的kd_tree,kd_tree的每一维在指定维度上分开所有的字节点,在树 的根部所有子节点是以第一个指定的维度上被分开。

k-d树算法可以分为两大部分,一部分是有关k-d树本身这种数据结构建立的算法,另一部分是在建立的k-d树上如何进行最邻近查找的算法。

详解KDTree:

https://blog.youkuaiyun.com/silangquan/article/details/41483689

PCL滤波介绍(1)

https://www.cnblogs.com/li-yao7758258/p/6445831.html

PCL中总结了几种需要进行点云滤波处理情况,这几种情况分别如下:
 (1)  点云数据密度不规则需要平滑
 (2) 因为遮挡等问题造成离群点需要去除
 (3) 大量数据需要下采样
 (4) 噪声数据需要去除
对应的方案如下:
 (1)按照给定的规则限制过滤去除点
 (2) 通过常用滤波算法修改点的部分属性
 (3)对数据进行下采样

PCL中点云滤波模块提供了很多灵活实用的滤波处理算法,例如:双边滤波,高斯滤波,条件滤波,直通滤波,基于随机采样一致性滤波。

双边滤波算法是通过取临近采样点和加权平均来修正当前采样点的位置,从而达到滤波效果,同时也会有选择剔除与当前采样点“差异”太大的相邻采样点,从而保持原特征的目的。

(1)在PCL 中使用直通滤波器对点云进行滤波处理

最简单的一种滤波器,它的作用是过滤掉在指定维度方向上取值不在给定值域内的点。直通滤波器的实现原理如下:首先,指定一个维度以及该维度下的值域,其次,遍历点云中的每个点,判断该点在指定维度上的取值是否在值域内,删除取值不在值域内的点,最后,遍历结束,留下的点即构成滤波后的点云。直通滤波器简单高效,适用于消除背景等操作。

(2)使用VoxelGrid(立体像素网格)滤波器对点云进行下采样:

使用体素化网格方法实现下采样,即减少点的数量 减少点云数据,并同时保存点云的形状特征,在提高配准,曲面重建,形状识别等算法速度中非常实用,PCL是实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格,容纳后每个体素内用体素中所有点的重心来近似显示体素中其他点,这样该体素内所有点都用一个重心点最终表示,对于所有体素处理后得到的过滤后的点云,这种方法比用体素中心逼近的方法更慢,但是对于采样点对应曲面的表示更为准确。

主要作用是对点云进行降采样,可以在保证点云原有几何结构基本不变的前提下减少点的数量,多用于密集型点云的预处理中,以加快后续配准、重建等操作的执行速度。体素栅格滤波器的主要思想是在点云所在三维空间创建一个体素栅格,对于栅格内的每一个体素,以体素内所有点的重心近似代替体素中的点,最终,所有体素中的重心点组成滤波后的点云。通过体素的大小可以控制降采样的程度,体素越大,则滤波后的点云越稀疏。体素栅格滤波器的执行速度较慢,但是它能最大限度地保留点云原始的几何信息。

PCL滤波介绍(2):

https://www.cnblogs.com/li-yao7758258/p/6464145.html

(1)使用statisticalOutlierRemoval滤波器(统计滤波器)移除离群点

 使用统计分析技术,从一个点云数据中集中移除测量噪声点(也就是离群点)比如:激光扫描通常会产生密度不均匀的点云数据集,另外测量中的误差也会产生稀疏的离群点,使效果不好,估计局部点云特征(例如采样点处法向量或曲率变化率)的运算复杂,这会导致错误的数值,反过来就会导致点云配准等后期的处理失败。

解决办法:每个点的邻域进行一个统计分析,并修剪掉一些不符合一定标准的点,稀疏离群点移除方法基于在输入数据中对点到临近点的距离分布的计算,对每一个点,计算它到它的所有临近点的平均距离,,假设得到的结果是一个高斯分布,其形状是由均值和标准差决定,平均距离在标准范围之外的点,可以被定义为离群点并可从数据中去除。

统计滤波器的主要思想是假设点云中所有的点与其最近的k个邻居点的平均距离满足高斯分布,那么,根据均值和方差可确定一个距离阈值,当某个点与其最近k个点的平均距离大于这个阈值时,判定该点为离群点并去除。统计滤波器的实现原理如下:首先,遍历点云,计算每个点与其最近的k个邻居点之间的平均距离;其次,计算所有平均距离的均值μ与标准差σ,则距离阈值dmax可表示为dmax=μ+α×σ,α是一个常数,可称为比例系数,它取决于邻居点的数目;最后,再次遍历点云,剔除与k个邻居点的平均距离大于dmax的点。

(2)使用参数化模型投影点云

 如何将点投影到一个参数化模型上(平面或者球体等),参数化模型通过一组参数来设定,通过其方程式:ax + by + cz + d = 0。对于平面来说使用其等式形式.在PCL中有特意存储常见模型系数的数据结构

PCL滤波介绍(3)

https://www.cnblogs.com/li-yao7758258/p/6473304.html

(1)从一个点云中提取索引

我们将学习如何使用:PCL:`ExtractIndices`过滤器,以基于由分割算法输出的指数点云提取点的子集。

(2)使用ConditionalRemoval(条件滤波器)  或RadiusOutlinerRemoval移除离群点

如何在滤波模块使用几种不同的方法移除离群点,对于ConditionalRemoval滤波器,可以一次删除满足对输入的点云设定的一个或多个条件指标的所有的数据点,RadiusOutlinerRemoval滤波器,它可以删除在输入点云一定范围内没有至少达到足够多近邻的所有数据点。

   关于RadiusOutlinerRemoval的理解,在点云数据中,设定每个点一定范围内周围至少有足够多的近邻,不满足就会被删除

   关于ConditionalRemoval 这个滤波器删除点云中不符合用户指定的一个或者多个条件的数据点

PCL点云特征描述与提取(1)

参考:https://www.cnblogs.com/li-yao7758258/p/6479255.html

3D点云特征描述与提取是点云信息处理中最基础也是最关键的一部分,点云的识别。分割,重采样,配准曲面重建等处理大部分算法,都严重依赖特征描述与提取的结果。从尺度上来分,一般分为局部特征的描述和全局特征的描述,例如局部的法线等几何形状特征的描述,全局的拓朴特征的描述,都属于3D点云特征描述与提取的范畴,

特征描述与提取相关的概念与算法

1.3D形状内容描述子(3D shape contexts)

利用描述子建立曲面间的对应点在3D物体识别领域有广发的应用,采用一个向量描述曲面上指定点及邻域的形状特征,通过匹配向量的值来建立不同曲面点的对应关系,此相邻则则称为指定点的俄描述子,经典描述子的3D形状内容描述子结构简单,辨别力强,且对噪声不敏感,

 PCL中描述三维特征相关基础

理论基础

     在原始表示形式下,点的定义是用笛卡尔坐标系坐标 x, y, z 相对于一个给定的原点来简单表示的三维映射系统的概念,假定坐标系的原点不随着时间而改变,这里有两个点p1和p2分别在时间t1和t2捕获,有着相同的坐标,对这两个点作比较其实是属于不适定问题(ill—posed problem),因为虽然相对于一些距离测度它们是相等的,但是它们取样于完全不同的表面,因此当把它们和临近的其他环境中点放在一起时,它们表达着完全不同的信息,这是因为在t1和t2之间局部环境有可能发生改变。一些获取设备也许能够提供取样点的额外数据,例如强度或表面反射率等,甚至颜色,然而那并不能完全解决问题,单从两个点之间来对比仍然是不适定问题。由于各种不同需求需要进行对比以便能够区分曲面空间的分布情况,应用软件要求更好的特征度量方式,因此作为一个单一实体的三维点概念和笛卡尔坐标系被淘汰了,出现了一个新的概念取而代之:局部描述子(locl descriptor)。文献中对这一概念的描述有许多种不同的命名,如:形状描述子(shape descriptors)或几何特征(geometric features),文本中剩余部分都统称为点特征表示。通过包括周围的领域,特征描述子能够表征采样表面的几何性质,它有助于解决不适定的对比问题,理想情况下相同或相似表面上的点的特征值将非常相似(相对特定度量准则),而不同表面上的点的特征描述子将有明显差异。下面几个条件,通过能否获得相同的局部表面特征值,可以判定点特征表示方式的优劣:

(1)刚体变换-----即三维旋转和三维平移变化 不会影响特征向量F估计,即特征向量具有平移选转不变性。

(2)改变采样密度-----原则上,一个局部表面小块的采样密度无论是大还是小,都应该有相同的特征向量值,即特征向量具有抗密度干扰性。

(3)噪声---数据中有轻微噪声的情况下,点特征表示在它的特征向量中必须保持相同或者极其相似的值,即特征向量对点云噪声具有稳定性。

通常,PCL中特征向量利用快速kd-tree查询 ,使用近似法来计算查询点的最近邻元素,通常有两种查询类型:K邻域查询,半径搜索两中方法

确定查询点的k个(用户给定参数)邻居(也称为k-search);

确定半径为r的球体内的查询点的所有邻居(也称为“半径搜索”)。

法线估计实例

给定一个几何表面,通常很难将表面某点的法线方向推断为垂直于该点表面的向量。但是,由于我们获取的点云数据集表示真实表面上的一组点样本,因此有两种可能性:

① 使用表面网格化技术从获取的点云数据集中获取基础表面,然后从网格中计算表面法线;

② 使用近似值直接从点云数据集中推断表面法线。

尽管存在许多不同的正态估计方法,但我们将集中于本教程的方法是最简单的方法之一,其公式如下。确定表面上某个点的法线的问题可以通过估计与该表面相切的平面的法线的问题来近似,这又成为最小二乘平面拟合估计问题。因此,将估计表面法线的解决方案简化为对从查询点的最近邻居创建的协方差矩阵的特征向量和特征值(或PCA –主成分分析)进行分析。更具体地说,对于每个点47406641bde244b8f7c63a3d69cccd31.png,我们将协方差矩阵组装ea2c0f7fdb1be2a275835fc7dfa5dd79.png如下:

87402087509434ecfabfa3da307d8d7d.png

4c42b7bec5680019da69c9145c261443.png为考虑点邻居的数目在附近 47406641bde244b8f7c63a3d69cccd31.png,表示3D质心最近的邻居,3f681ddc1d5160d03184eb81428a8a05.png是 d5a41c2a69f8e653eaa7f5224f5c6170.png协方差矩阵的特征值第,并且603917481dce68f4de09e2a8974623d9.png 在d5a41c2a69f8e653eaa7f5224f5c6170.png个特征向量。

加入头文件:

#includeVTK_MODULE_INIT(vtkRenderingOpenGL);

一旦确定邻域以后,查询点的邻域点可以用来估计一个局部特征描述子,它用查询点周围领域点描述采样面的几何特征,描述几何表面图形的一个重要属性,首先是推断它在坐标系中的方位,也就是估计他的法线,表面法线是表面的一个重要的属性,在许多领域都有重要的应用,如果用光源来生成符合视觉效果的渲染等

1.输入数据集中的所有点估计一组表面法线

(实现对输入点云数据集中的点估计一组表面法线)执行的操作是:对应点云P中每一个点p得到p点最近邻元素,计算p点的表面的法线N,检查N的方向是否指向视点如果不是则翻转。

 视点默认坐标是(0,0,0)可使用setViewPoint(float vpx,float vpy,float vpz)来更换

2.输入数据集中的点的子集估计一组表面法线

表面法线是几何体表面一个十分重要的属性,例如:在进行光照渲染时产生符合可视习惯的效果时需要表面法线的信息才能正常进行,对于一个已经已经知道的几何体表面,根据垂直于点表面的的矢量,因此推推处表面某一点的法线方向比较容易,然而由于我们获取的点云的数据集在真实的物体的表面表现为一组定点的样本,这样就会有两种方法解决:

① 使用曲面重建技术,从获取的点云数据中得到采样点对应的曲面,然后从曲面模型中计算出表面法线

② 直接从点云数据中近似推断表面法线在确定表面一点法线的问题近似于估计表面的一个相切面法线的问题,因此转换过来就是求一个最小二乘法平面拟合的问题。

3.输入数据集中的所有点估计一组表面法线,但将使用另一个数据集估计其最近的邻居。如前所述,一个很好的用例是输入是表面的降采样版本。

实例:使用积分图进行法线估计

实例:使用积分图计算一个有序的点云的法线,注意此方法只适用有序点云

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值