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;用左下角的杯子作…

计算机电路基础答案,计算机电路基础模拟试卷答案(B)

计算机电路基础》复习题型模拟试卷《计算机电路基础》模拟考试试卷答案(B)一、填空题(1) 场效应管3个电极G、D、S其功能与晶体三极管的 B、C、E 电极相对应&#xff0c;而N沟道和P沟道场效应管则分别类同于 NPN型、PNP型 两种类型的晶体三极管。(2) 触发器分为边沿触发和 脉冲 …

从一个深度图里面导出NARF特征

本节将显示如何提取出NARF关键点通过NARF描述器从一个深度图里面。 以下是一段代码 #include <iostream>#include <boost/thread/thread.hpp> #include <pcl/range_image/range_image.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/…

计算机综合症怎么治,电脑综合症的治疗方法有哪些?

眼保健操(1)操作时保证正确坐姿&#xff0c;尽可能保持自然的端坐位&#xff0c;将后背坐直&#xff0c;并保持颈部的挺直。两肩自然下垂&#xff0c;上臂贴近身体&#xff0c;手肘弯曲成90度&#xff0c;操作键盘或鼠标&#xff0c;应使手腕保持水平。电脑的摆放高度要适度&am…

惯性矩和偏心距描述器

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

孕妇能长期在计算机屏幕前工作吗,怀孕了在电脑前工作怎么办

导读:我们自然界的一切物体&#xff0c;只要温度在绝对温度零度以上&#xff0c;都会以电磁波的形式不停地向外传送热量&#xff0c;这种传送能量的方式被称为辐射&#xff0c;我们生活中常见的就是受到电脑的辐射&#xff0c;怀孕期间应该避免电脑的辐射&#xff0c;不然就会对…

pcl里面的RoPs特征(Rotational Projection Statistics)

这次我们将使用pcl::ROPSEstimation这个类来导出点的特征。 下面是这个方法的特征提取方式。有一个网格和一个点集可以让我们来执行一些简单的操作。第一步&#xff0c;对于一个给定的兴趣点局部的表面将会被削平。局部表面包含了在半径内的点和三角形。对于给定的局部表面LRF…

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

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

pcl使用通道滤波器来滤波

这次我们将展示一个简单的滤波的案例--把不符合的值去掉 代码 #include <iostream> #include <pcl/point_types.h> #include <pcl/filters/passthrough.h>intmain (int argc, char** argv) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::Po…

教师网络计算机研修日志,教师网络研修日志

《教师网络研修日志》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《教师网络研修日志(2页珍藏版)》请在人人文库网上搜索。1、教师网络研修日志网络研修平台拉近了每一位教育工作者的距离&#xff0c;巨大的网络力量掀起了教研的火热浪潮。研修平台传递着省级专家的…

用体元滤波器进行降低采样

我们这次用voxel filter(体元滤波器)来滤波 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/filters/voxel_grid.h>int main (int argc, char** argv) {pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLP…

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

多串口通信服务器 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;可使用密钥对的私钥登录弹性云服务器。使用的登录…

pcl从一个点云里面导出下标

我们这次将学着使用ExtractIndices滤波器来从一个分割算法中导出点的下标。为了不把这个项目复杂化&#xff0c;我们不会在这里解释分割算法。 我们先建一个extract_indices.cpp 代码 #include <iostream>#include <pcl/ModelCoefficients.h>#include <pcl/i…