pcl里面的点特征直方图(PFH)

表面法线和曲率可以好的代表一个点的几何特征。然而它们算得很快,而且算法简单,但是它们不能捕获细节,它们只是点的近邻的几何特征的近似估计。作为一个直接的结论,大多数的场景往往会包括很多有着相似特征的点,这会减少它们所带来的消息量。

这次我们将引进一个叫做PFH(point feature histgrams)的3D特征描述器,同时还将显示出它的一些理论优势,并讨论它的一些实现细节。

PFH的目标是通过使用一个点周围的多维直方图的平均曲率来编码一个点的k个最近邻的几何属性。这个高维空间提供了一些有用的特征代表,同时关于6位位姿不变的,同时和可以很好的应对不同的采样密度和近邻的噪声水平。

一个点特征直方图是与点的最近邻和法线有关的,简单的说,它企图通过考虑各个预测法线方向之间的影响来捕获最好的采样平面。最终的高维空间因此和每个点的表面法线的方向有关。

下面的图展示了一个PFH在计算Pq这个点时候的影响区域图,Pq这个点用红色标记并放在半径为r的圆圈的中央,然后它的所有近邻(离点的距离小于半径r)都通过一个网格来间接的相邻着。下面的PFH描述器作为了一个直方图计算了所有匹配的点之间的关系,有一个O(k方)的复杂度。

计算pi和pj之间的绝对差,和与它们相关联的法线ns和nj,我们定义了一个固定的坐标系在某个点上。

我发现官网里面的上面的式子与下面的图对应不上,以图为标准,式子里面的那个v向量的方向和大小与图里面的都对不上。使用上面的uvw的坐标系,ns法线和ni法线的差可以化解为下面的3个角度的差异(因为他们的模都是一样的):

d是两点距离的平方,是每对点的4要素,这样就把原来的12个值(2x每个点的{(x,y,z),(nx,ny,nz)})减低为4个值。

使用PFH得到一个点的四要素可以用下面的方法:

computePairFeatures (const Eigen::Vector4f &p1, const Eigen::Vector4f &n1,
const Eigen::Vector4f &p2, const Eigen::Vector4f &n2,
float &f1, float &f2, float &f3, float &f4);

去生成最终的对每个查询点的PFH代表,四要素这个集合将放到直方图里面。分发的过程是把所有的特征(上面的3个角度,一个距离的平方)平均分割成b小份,然后数每个子区间上的个数。因为有3个特征是法线间的角度,所以他们可以很好的归一化并把它们放到三角函数的圆(高中知识)里面。一个分发的案例是把每个特征区间进行平均分配,然后我们就有了一个有b的四次方分发的柱状图。在这个图里面有一个区间的值不为0代表着,它这个特征有一定的值。下面的这幅图展示了一个点云里面不同点的PFH图。

 

有的情况下,d不是一个好的特征对于2.5D的数据集,比如机器人来说,距离会随着视点发生变化。所以,有的时候省略d是比较好的。

PFH特征在PCL里面是pcl_features库里面

默认的PFH用5个区间来分发,并不包括距离,因此有125比特的数组生成5的3次方,并把它们放在pcl::PFHSignature125这个点类型里面。

下面是一个代码段。

#include <pcl/point_types.h>
#include <pcl/features/pfh.h>
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::Normal>::Ptr normals (new pcl::PointCloud<pcl::Normal> ());
... read, pass in or create a point cloud with normals ...
... (note: you can create a single PointCloud<PointNormal> if you want) ...
// Create the PFH estimation class, and pass the input dataset+normals to it
pcl::PFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::PFHSignature125> pfh;
pfh.setInputCloud (cloud);
pfh.setInputNormals (normals);
// alternatively, if cloud is of tpe PointNormal, do pfh.setInputNormals (cloud);
// Create an empty kdtree representation, and pass it to the PFH estimation object.
// Its content will be filled inside the object, based on the given input dataset (as no other search surface is given).
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
//pcl::KdTreeFLANN<pcl::PointXYZ>::Ptr tree (new pcl::KdTreeFLANN<pcl::PointXYZ> ()); -- older call for PCL 1.5-
pfh.setSearchMethod (tree);
// Output datasets
pcl::PointCloud<pcl::PFHSignature125>::Ptr pfhs (new pcl::PointCloud<pcl::PFHSignature125> ());
// Use all neighbors in a sphere of radius 5cm
// IMPORTANT: the radius used here has to be larger than the radius used to estimate the surface normals!!!
pfh.setRadiusSearch (0.05);
// Compute the features
pfh.compute (*pfhs);
// pfhs->points.size () should have the same size as the input cloud->points.size ()*
}

PFHEstimation类的内部做了几件事情:

1.得到p的最近邻

2.给每个邻近的配对,计算3个角度

3.把所有的结果分发到直方图里面。

只计算一个单一的PFH特征代表:

computePointPFHSignature (const pcl::PointCloud<PointInT> &cloud,
const pcl::PointCloud<PointNT> &normals,
const std::vector<int> &indices,
int nr_split,
Eigen::VectorXf &pfh_histogram);

nr_spilit是被分发的某个区间,即代表了某个角度特征,pfh_histgram是结果的直方图。

因为有的时候法线的值可能是NaN(不是数字)或者无效值,所以可以用下面的代码进行优化,下面这段代码放在compute()这个函数的上面

for (int i = 0; i < normals->points.size(); i++)
{
if (!pcl::isFinite<pcl::Normal>(normals->points[i]))
{
PCL_WARN("normals[%d] is not finite\n", i);
}
}

 

 

 

 

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

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

相关文章

为什么计算机休眠风扇还转,Win7系统进入睡眠模式后电脑风扇还在转的解决方法...

如果长时间离开电脑&#xff0c;可以让win7系统进“睡眠”模式&#xff0c;这样可以节省能源&#xff0c;延长硬盘寿命。但是有位用户说自己Win7系统进入睡眠模式后&#xff0c;依旧可以听到风扇还在转&#xff0c;怎么回事呢&#xff1f;其实这是因为Win7处在低耗能的状态&…

快速特征点直方图描述器(FPFH)

PFH的理论上的时间复杂度是O(nk的平方)&#xff0c;n是点的数量&#xff0c;k是最近邻的个数。对于实时系统来说&#xff0c;这压根就是不行的&#xff0c;所以作为PFH规划的简化版本&#xff0c;FPFH把计算复杂度减少成O(nk),但是还具有很好的和PFH差不多的区分能力。 第一步…

计算机硬盘能达到5g的速度,5G号称可以达到几GB每秒,但是目前的手机处理器和硬盘可以处理这么庞大的数据量吗?...

感谢悟空的邀请&#xff01;“通信行业那些事儿”&#xff0c;专业解读通信、网络类问题&#xff0c;希望我的回答能够给您启发&#xff0c;大家共同探讨、共同提高&#xff01;欢迎关注我&#xff01;楼主您好&#xff01;这个问题&#xff0c;我正好是通信行业的从业人员&…

点集的视点特征直方图的评估

VFH(Viewpoint Feature Histgram)视角特征直方图描述器&#xff0c;可以很直观的表现点的聚类在处理聚类识别与6DOF位姿估计。 下面的图像展示了一个VFH识别和位姿估计的例子。给一些训练集&#xff0c;除了左下角的那个杯子&#xff0c;用来学习&#xff0c;用左下角的杯子作…

惯性矩和偏心距描述器

这次我们将学会怎么使用pcl::MomentOfInertiaEstimation 这个类来获取以惯性矩和偏心距为基础的描述器。这个类也能提取坐标对称和定向包围的方形盒子。但是记住导出的OBB不是最小可能性的盒子。 下面介绍了该种方法的特征提取方式。第一次先算出点云矩阵的协方差&#xff0c;…

mac os修改计算机名,如何修改Mac系统的个人用户名?

在Mac OS X中一旦建立一个用户&#xff0c;此用户的主目录的目录名将会是它的“短”名。更改登录名和主目录名从来都不简单&#xff0c;以前唯一的方法就是建立一个新用户&#xff0c;然后把所有的文件拷贝过去。Mac 修改用户是一件很悲剧的事&#xff0c;因为牵涉到很多地方的…

无线多串口服务器,多串口通信服务器

多串口通信服务器 ZLAN5G00A串口服务器是一款机架式16串口RS232/485/422和TCP/IP之间协议转化器。支持16个RS232串口、16个RS485、RS422串口&#xff0c;且RS232支持流控。通过一根网线连接到ZLAN5G00A&#xff0c;实现16个串口同时全双工工作&#xff0c;每路串口可作为TCP服务…

使用统计异常消除滤波器来消除异常

激光扫描可以生成很多点云的数据集。并且&#xff0c;测量误差会导致一些稀疏的异常值使得结果更差。这使得局部点云特征估计变得更加的复杂&#xff0c;产生一些错误的值&#xff0c;使得点云的识别失败。有些不规则的数据可以通过数理统计的方法来消除。我们稀疏异样消除是以…

为什么有的网站要改服务器才能打开吗,为什么有些网站进不了,怎样设置DNS才能进 – 手机爱问...

2006-12-24从22号起就进不了游戏。 按照官方的DNS地址也不行。 有没有广东深圳罗湖区的朋友能进的 麻烦把你们的DNS地址发给我 谢谢对于上述无法登陆游戏的玩家&#xff0c;《神泣》中国运营团队建议您尝试以下方式&#xff0c;通过修改个人电脑的DNS解析服务器地址&#xff0c…

用一个参数化的模型来投影点

这次我们将学着怎么通过一个参数化的模型进行投影。这个参数化的模型是通过一系列的系数---在这里是平面&#xff0c;相当于axbyczd0 下面是代码 #include <iostream>#include <pcl/io/pcd_io.h>#include <pcl/point_types.h>#include <pcl/ModelCoeffi…

云 文件 服务器 只存,云 文件 服务器只存

云 文件 服务器只存 内容精选换一换用户通过管理控制台创建或者导入密钥对后&#xff0c;在购买弹性云服务器时&#xff0c;登录方式选择密钥对&#xff0c;并选择创建或者导入的密钥对。用户购买弹性云服务器成功后&#xff0c;可使用密钥对的私钥登录弹性云服务器。使用的登录…

sr650服务器cpu型号,至强Gold 联想ThinkSystem SR650评测

今年7月&#xff0c;英特尔发布了至强可扩展处理器。面对新的处理器架构、新的AVX512指令集&#xff0c;需要新的服务器来匹配&#xff0c;需要更新机器&#xff0c;并提供新的软件、管理等套件。联想ThinkSystem SR650与至强可扩展处理器响应而出并被誉为“性能最高的服务器”…

使用一个环境的或者半径异样消除器来进行异样消除

这个文档显示了在滤波模型里面如何使用几个不同的方法来消除点云里面的异常。 第一步我们将使用一个环境消除滤波器来消除不满足环境条件的点云。然后我们将学会如何使用一个RadiusOutlierRemoval滤波器来消除在指定范围内没有达到指定数量邻居的点。 代码 #include <iost…

trailmakers未能连接服务器,Trailmakers联机版

《Trailmakers联机版》是一款可以联机进行的精美3D沙盒世界以创造为核心玩法的动作手游&#xff0c;这款游戏上手起来挺简单轻松的&#xff0c;诸多趣味内容&#xff0c;将让各位玩家们收获到极致的快感&#xff0c;非常的赞&#xff0c;不想错过任何欢乐与趣味的话&#xff0c…

lga775服务器cpu系列,【LGA775处理器 多的不仅是针脚】- 中关村在线

继发布新一代平台后&#xff0c;Intel推出了LGA775封装的P4处理器。这场被业界称为跨越性的技术革命&#xff0c;究竟能为用户带来什么样的变化和感受&#xff1f;它与Socket 478的处理器有何区别呢&#xff1f;● 何为LGA775LGA(Land Grid Array&#xff0c;栅格阵列封装)即So…

从深度图里面导出边界

这次我们将学着怎么从一个深度图里面导出边界。我们对3种不同种类的点很感兴趣:物体的边框的点&#xff0c;阴影边框点&#xff0c;和面纱点(在障碍物边界和阴影边界)&#xff0c;这是一个很典型的现象在通过雷达获取的3D深度。 下面是代码 /* \author Bastian Steder */#incl…

隐式形状模型

在这次我们将学会隐式形状模型算法通过pcl::ism::ImplicitShapeModel这个类来实现。这个算法是把Hough转换和特征近似包进行结合。有训练集&#xff0c;这个算法将计算一个确定的模型用来预测一个物体的中心。 这个算法由两部分组成&#xff0c;第一部分是训练&#xff0c;第二…

3D物体识别的假设检验

3D物体识别的假设验证 这次目的在于解释如何做3D物体识别通过验证模型假设在聚类里面。在描述器匹配后&#xff0c;这次我们将运行某个相关组算法在PCL里面为了聚类点对点相关性的集合&#xff0c;决定假设物体在场景里面的实例。在这个假定里面&#xff0c;全局假设验证算法将…

怎么样递增的注册成对的点云

这次我们将使用Iterative Closest Point algorithm来递增的注册一系列的点云。 这个主意来自于把所有的点云转换成第一个点云的框架&#xff0c;通过找到每个连续点云间最好的装换&#xff0c;并且计算整个点云的转换。 你的数据集应该由重新排列的&#xff0c;在一个相同的框…

qt入门

&#xfeff;&#xfeff;qt入门 1.首先我们先创建一个qt的空项目 1.这会生成两个文件 xx.pro xx.pro.user xx.pro文件是qt的工程文件&#xff0c;有点类似于vc的prj文件&#xff0c;或者sln文件。xx.pro.user是这个当前环境下的工程文件。(移植的时候这个文件没啥用) 以…