前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >PCL点云特征描述与提取(1)

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

作者头像
点云PCL博主
发布于 2019-07-31 02:45:01
发布于 2019-07-31 02:45:01
2.8K00
代码可运行
举报
文章被收录于专栏:点云PCL点云PCL
运行总次数:0
代码可运行

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

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

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

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

2,旋转图像(spin iamge)

旋转图像最早是由johnson提出的特征描述子,主要用于3D场景中的曲面匹配和模型识别,

3,涉及的算法相关的资料

3D形状内容描述子

https://en.wikipedia.org/wiki/Shape_context

www.eecs.berkeley.edu/Research/Projects/CS/vision/shape/belongie-pami02.pdf

还有很多中描述子的理论与算法的研究,不再一一列出来

关于理论的部分有待研究,但是暂时我只是学习会用。

关于PCL中特征描述与提取模块和相关类的介绍

Classes

class

pcl::ShapeContext3DEstimation< PointInT, PointNT, PointOutT >

实现3D形状内容描述子算法

class

pcl::BOARDLocalReferenceFrameEstimation< PointInT, PointNT, PointOutT >

实现局部坐标系估计的方法 特别是处理点云边缘或有孔洞有特殊的处理方式

class

pcl::BoundaryEstimation< PointInT, PointNT, PointOutT >

实现估计一组点集是否处于指定点的投影区域的边缘位置

class

pcl::CRHEstimation< PointInT, PointNT, PointOutT >

实现摄像头旋转直方图描述子,利用概算法主要进行刚体对象的位姿估计

class

pcl::CVFHEstimation< PointInT, PointNT, PointOutT >

实现聚类视点直方图CVFH描述子的计算 主要是针对解决有残缺的点云识别问题

class

pcl::ESFEstimation< PointInT, PointOutT >

实现ESF描述子,主要用于实时对三维场景中的点云模型进行分类而提出的

class

pcl::Feature< PointInT, PointOutT > 是所有特征相关模块中其他类的基类

class

pcl::FeatureWithLocalReferenceFrames< PointInT, PointRFT >

实现FPFH描述子算法主要针对点云配准过程中对应点而提出的

(关于他的类还有很多可以直接去网站自己查看)

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邻域查询,半径搜索两中方法

法线估计实例

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

代码解析:normal_estimation.cpp

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/integral_image_normal.h>  //法线估计类头文件
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
int main ()
{
//打开点云代码
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile ("table_scene_lms400.pcd", *cloud);//创建法线估计估计向量pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud (cloud);
 
//创建一个空的KdTree对象,并把它传递给法线估计向量//基于给出的输入数据集,KdTree将被建立pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
ne.setSearchMethod (tree);//存储输出数据

pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);//使用半径在查询点周围3厘米范围内的所有临近元素
ne.setRadiusSearch (0.03);
//计算特征值
ne.compute (*cloud_normals);// cloud_normals->points.size ()应该与input cloud_downsampled->points.size ()有相同的尺寸//可视化

pcl::visualization::PCLVisualizer viewer("PCL Viewer");
viewer.setBackgroundColor (0.0, 0.0, 0.0);
viewer.addPointCloudNormals<pcl::PointXYZ,pcl::Normal>(cloud, cloud_normals);while (!viewer.wasStopped ())
{
    viewer.spinOnce ();
}return 0;
}

运行结果并执行:

(2)估计一个点云的表面法线

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

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

2. 直接从点云数据中近似推断表面法线

在确定表面一点法线的问题近似于估计表面的一个相切面法线的问题,因此转换过来就是求一个最小二乘法平面拟合的问题

(3)使用积分图进行法线估计

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

代码解析normal_estimation_using_integral_images.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 #include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/integral_image_normal.h>
#include <pcl/visualization/cloud_viewer.h>     
 int main ()
    {           pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile ("table_scene_mug_stereo_textured.pcd", *cloud);             //创建法线估计向量
pcl::PointCloud<pcl::Normal>::Ptr normals (new pcl::PointCloud<pcl::Normal>);
 pcl::IntegralImageNormalEstimation<pcl::PointXYZ, pcl::Normal> ne;         
/*
 三种法线估计方法
 COVARIANCE_MATRIX 模式从具体某个点的局部邻域的协方差矩阵创建9个积分,来计算这个点的法线
 AVERAGE_3D_GRADIENT   模式创建6个积分图来计算水平方向和垂直方向的平滑后的三维梯度并使用两个梯度间的向量积计算法线
AVERAGE_DEPTH——CHANGE  模式只创建了一个单一的积分图,从而平局深度变化计算法线*/
ne.setNormalEstimationMethod (ne.AVERAGE_3D_GRADIENT);  //设置法线估计的方式      ne.setMaxDepthChangeFactor(0.02f);   //设置深度变化系数ne.setNormalSmoothingSize(10.0f);   //设置法线优化时考虑的邻域的大小
ne.setInputCloud(cloud);               //输入的点云ne.compute(*normals);                    //计算法线             //可视化
pcl::visualization::PCLVisualizer viewer("PCL Viewer");   //视口的名称viewer.setBackgroundColor (0.0, 0.0, 0.5);  //背景颜色的设置
viewer.addPointCloudNormals<pcl::PointXYZ,pcl::Normal>(cloud, normals);  //将法线加入到点云中
while (!viewer.wasStopped ())
  {
   viewer.spinOnce ();
  }           
  return 0;
}

运行结果为:

计算发现是点云提取特征点的重要的前提步骤,当然这些都是基本的实验而已并没有难以理解的,而且这只是一个相当于opencv的三维图像处理的库函数而已,只是熟悉一下,有什么想做的想实现的实验或者工程可以一起讨论分享。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 点云PCL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PCL点云特征描述与提取(2)
正如点特征表示法所示,表面法线和曲率估计是某个点周围的几何特征基本表示法。虽然计算非常快速容易,但是无法获得太多信息,因为它们只使用很少的几个参数值来近似表示一个点的k邻域的几何特征。然而大部分场景中包含许多特征点,这些特征点有相同的或者非常相近的特征值,因此采用点特征表示法,其直接结果就减少了全局的特征信息。那么三维特征描述子中一位成员:点特征直方图(Point Feature Histograms),我们简称为PFH,从PCL实现的角度讨论其实施细节。PFH特征不仅与坐标轴三维数据有关,同时还与表面法线有关。
点云PCL博主
2019/07/31
1.2K0
PCL点云特征描述与提取(2)
PCL点云特征描述与提取(3)
已知点云P中有n个点,那么它的点特征直方图(PFH)的理论计算复杂度是,其中k是点云P中每个点p计算特征向量时考虑的邻域数量。对于实时应用或接近实时应用中,密集点云的点特征直方图(PFH)的计算,是一个主要的性能瓶颈。此处为PFH计算方式的简化形式,称为快速点特征直方图FPFH(Fast Point Feature Histograms)
点云PCL博主
2019/07/31
2K0
PCL点云特征描述与提取(3)
PCL 特征模块
包含了用于点云数据估计三维特征的数据结构和功能函数,三维特征是空间中某个三维点或者位置的表示,它是基于点周围的可用信息来描述几何的图形的一种表示。在三维空间中,查询点周围的方法一般是K领域查找。三维空间的特征点物理意义上与图像类似,都是使用一些具有显著特征的点来表示整个点云
点云PCL博主
2020/08/20
2.1K0
一分钟详解PCL中点云配准技术
本文是对前两篇文章:点云配准(一 两两配准)以及3D点云(二 多福点云配准)的补充,希望可以在一定程度上帮助大家对点云配准理解地更为深刻。
计算机视觉
2020/12/11
2.2K0
一分钟详解PCL中点云配准技术
PCL点云分割(1)
点云分割是根据空间,几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征,点云的有效分割往往是许多应用的前提,例如逆向工作,CAD领域对零件的不同扫描表面进行分割,然后才能更好的进行空洞修复曲面重建,特征描述和提取,进而进行基于3D内容的检索,组合重用等。
点云PCL博主
2019/07/31
4.1K0
PCL点云分割(1)
PCL点云特征描述与提取(4)
这将自动生成一个呈矩形的点云,检测的特征点处在角落处,参数-m是必要的,因为矩形周围的区域观测不到,但是属于边界部分,因此系统无法检测到这部分区域的特征点,选项-m将看不到的区域改变到最大范围读取,从而使系统能够使用这些边界区域。
点云PCL博主
2019/07/31
9200
PCL点云特征描述与提取(4)
PCL关键点(1)
关键点也称为兴趣点,它是2D图像或是3D点云或者曲面模型上,可以通过定义检测标准来获取的具有稳定性,区别性的点集,从技术上来说,关键点的数量相比于原始点云或图像的数据量减小很多,与局部特征描述子结合在一起,组成关键点描述子常用来形成原始数据的表示,而且不失代表性和描述性,从而加快了后续的识别,追踪等对数据的处理了速度,故而,关键点技术成为在2D和3D 信息处理中非常关键的技术
点云PCL博主
2019/07/31
1.1K0
PCL关键点(1)
PCL
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
sofu456
2019/08/31
2.1K0
点云表面法向量的估计
点云表面法向量是一种重要几何表面特性,在计算机图像学中有很广的应用,例如在进行光照渲染和其他可视化效果时确定一个合理的光源位置。
点云PCL博主
2019/08/05
3.7K0
点云表面法向量的估计
PCL中分割方法的介绍(3)
上两篇介绍了关于欧几里德分割,条件分割,最小分割法等等还有之前就有用RANSAC法的分割方法,这一篇是关于区域生成的分割法,
点云PCL博主
2019/07/31
9960
PCL中分割方法的介绍(3)
PCL点云配准(1)
在逆向工程,计算机视觉,文物数字化等领域中,由于点云的不完整,旋转错位,平移错位等,使得要得到的完整的点云就需要对局部点云进行配准,为了得到被测物体的完整数据模型,需要确定一个合适的坐标系,将从各个视角得到的点集合并到统一的坐标系下形成一个完整的点云,然后就可以方便进行可视化的操作,这就是点云数据的配准。点云的配准有手动配准依赖仪器的配准,和自动配准,点云的自动配准技术是通过一定的算法或者统计学规律利用计算机计算两块点云之间错位,从而达到两块点云自动配准的效果,其实质就是把不同的坐标系中测得到的数据点云进行坐标系的变换,以得到整体的数据模型,问题的关键是如何让得到坐标变换的参数R(旋转矩阵)和T(平移向量),使得两视角下测得的三维数据经坐标变换后的距离最小,,目前配准算法按照过程可以分为整体配准和局部配准,。PCL中有单独的配准模块,实现了配准相关的基础数据结构,和经典的配准算法如ICP。
点云PCL博主
2019/07/31
2.5K0
PCL点云配准(1)
pcl_filters模块api代码解析
上周点云公众号开启了学习模式,由博主分配任务,半个月甚至一个月参与学习小伙伴的反馈给群主,并在微信交流群中进行学术交流,加强大家的阅读文献能力,并提高公众号的分享效果。在此期待更多的同学能参与进来!(目前已经有成员反馈,还有需要小伙伴没有发过来哦,下周开始会将分享整理出来,定期分享,并将文档上传至github组群,已经有部分分享上传至github组群中,供大家下载查看,并且有问题可以在github的issues中提问,大家可以相互提问并解答)
点云PCL博主
2019/07/30
2K0
pcl_filters模块api代码解析
【PCL】NDT点云配准(Registration)
由于LiDAR一次扫描只能得到局部点云信息,为了能获得全局点云信息(如一个房间、一个三维物体),就需要进行多次连续扫描,并进行点云配准。由于每次扫描得到的点云都有独立的坐标系,因此点云配准时要进行坐标变换(旋转、平移),将多帧不同坐标系下的点云整合到一个坐标系下。
DevFrank
2024/07/24
3540
PCL_common模块api代码解析
上周点云公众号开启了学习模式,由博主分配任务,半个月甚至一个月参与学习小伙伴的反馈给群主,并在微信交流群中进行学术交流,加强大家的阅读文献能力,并提高公众号的分享效果。在此期待更多的同学能参与进来!(目前已经有成员反馈,下周开始会将分享整理出来,定期分享,并将文档上传至github组群,供大家下载查看,并且有问题可以在github的issues中提问,大家可以相互提问并解答)
点云PCL博主
2019/07/30
1.1K0
PCL_common模块api代码解析
PCL—低层次视觉—关键点检测(Harris)
  除去NARF这种和特征检测联系比较紧密的方法外,一般来说特征检测都会对曲率变化比较剧烈的点更敏感。Harris算法是图像检测识别算法中非常重要的一个算法,其对物体姿态变化鲁棒性好,对旋转不敏感,可以很好的检测出物体的角点。甚至对于标定算法而言,HARRIS角点检测是使之能成功进行的基础。
点云PCL博主
2019/07/31
1.2K0
PCL—低层次视觉—关键点检测(Harris)
PCLVisualizer可视化类
PCLVisualizer可视化类是PCL中功能最全的可视化类,与CloudViewer可视化类相比,PCLVisualizer使用起来更为复杂,但该类具有更全面的功能,如显示法线、绘制多种形状和多个视口。本小节将通过示例代码演示PCLVisualizer可视化类的功能,从显示单个点云开始。大多数示例代码都是用于创建点云并可视化其某些特征
点云PCL博主
2019/07/31
1.9K0
PCLVisualizer可视化类
PCL中的区域生长分割(region growing segmentation)
首先注意一点,这里是region growing segmentation,不是color-based region growing segmentation.
点云PCL博主
2019/07/30
6.9K0
PCL中的区域生长分割(region growing segmentation)
点云NDT配准方法介绍
本文介绍的是另一种比较好的配准算法,NDT配准。所谓NDT就是正态分布变换,作用与ICP一样用来估计两个点云之间的刚体变换。用标准最优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快。
点云PCL博主
2019/08/05
4.7K0
点云NDT配准方法介绍
PCL滤波介绍(1)
在获取点云数据时 ,由于设备精度,操作者经验环境因素带来的影响,以及电磁波的衍射特性,被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中讲不可避免的出现一些噪声。在点云处理流程中滤波处理作为预处理的第一步,对后续的影响比较大,只有在滤波预处理中将噪声点 ,离群点,孔洞,数据压缩等按照后续处理定制,才能够更好的进行配准,特征提取,曲面重建,可视化等后续应用处理,PCL中点云滤波模块提供了很多灵活实用的滤波处理算法,例如:双边滤波,高斯滤波,条件滤波,直通滤波,基于随机采样一致性滤波, PCL中点云滤波的方案 PCL中总结了几种需要进行点云滤波处理情况,这几种情况分别如下: (1) 点云数据密度不规则需要平滑 (2) 因为遮挡等问题造成离群点需要去除 (3) 大量数据需要下采样 (4) 噪声数据需要去除 对应的方案如下: (1)按照给定的规则限制过滤去除点 (2) 通过常用滤波算法修改点的部分属性 (3)对数据进行下采样 双边滤波算法是通过取临近采样点和加权平均来修正当前采样点的位置,从而达到滤波效果,同时也会有选择剔除与当前采样点“差异”太大的相邻采样点,从而保持原特征的目的
点云PCL博主
2019/07/30
1.5K0
【3D篇】点云拼接
computeSurfaceNormals() has finished in 0 s
threeQing
2021/09/29
1.6K0
【3D篇】点云拼接
相关推荐
PCL点云特征描述与提取(2)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验