三维计算机视觉(五)--特征描述子

三维计算机视觉(五)--特征描述⼦
PPF
机器⼈视觉中有⼀项重要⼈物就是从场景中提取物体的位置,姿态。图像处理算法借助Deep Learning 的东风已经在图像的物体标记领域耍的飞起了。⽽从三维场景中提取物体还有待研究。⽬前已有的思路是先提取关键点,再使⽤各种局部特征描述⼦对关键点进⾏描述,最后与待检测物体进⾏⽐对,得到点-点的匹配。个别⽂章在之后还采取了ICP对匹配结果进⾏优化。
 对于缺乏表⾯纹理信息,或局部曲率变化很⼩,或点云本⾝就⾮常稀疏的物体,采⽤局部特征描述⼦很难有效的提取到匹配对。所以就有了所谓基于Point Pair 的特征,该特征使⽤了⼀些全局的信息来进⾏匹配,更神奇的是,最终的位姿估计结果并不会陷⼊局部最⼩值。详细可参见论⽂:Model globally, match locally: Efficient and robust 3D object recognition. 与 Going further with point pair features。SLAM的重要研究⽅向object based Slam 也声称使⽤了Point Pair Feature进⾏匹配。
为了更好的理解这种⽅法,⽽在pcl中也没有到现成的算法,所以我⾃⼰⽤matlab实现了⼀遍。
算法的思想很简单:
0、ppf 特征为[d,<d,n1>,<d,n2>,<n1,n2>].
1、针对⽬标模型,在两两点之间构造点对特征F,如果有N个点,那么就有N*N个特征(说明此算法是O(N2)的),N*N个特征形成特征集F_Set
2、在场景中任意取1定点a,再任意取1动点b,构造ppf特征,并从F_set中寻对应的,那么理想情况下,如果到了完全匹配的特征,则可获得点云匹配的结果。
3、此算法是⼀种投票算法,每次匹配都能得到⼀个旋转⾓度,如果m个b都投票给了某⼀旋转⾓度则可认为匹配成功
这个算法最⼤的问题就是不停的采样会导致极⼤的计算量。不过算法本⾝确实可以匹配物体和场景。
ppf 特征的构建
1 function obj = ppf(point1,point2)
2    d = point1.Location - point2.Location;硅胶海绵条
3    d_unit = d/norm(d);
4    apha1 = acos(point1.Normal*d_unit');
5    apha2 = acos(point2.Normal*d_unit');
6    apha3 = acos(point1.Normal*point2.Normal');
7    obj = [norm(d),apha1,apha2,apha3];
8 end
ppf 特征集的构建
1 classdef modelFeatureSet < handle
2    %MODELFEATURESET 此处显⽰有关此类的摘要
3    %  此处显⽰详细说明
4
5    properties
6        FeatureTree
7        ModelPointCloud
8        Pairs
9    end
10
11    methods工业废渣制砖
12        function obj = modelFeatureSet(pt)
13            obj.ModelPointCloud = veInvalidPoints());
14        end
15        function growTree(self)
16            self.ModelPointCloud = pcdownsample(self.ModelPointCloud,'GridAverage',.1);
17            pt_size = self.ModelPointCloud.Count;
18            idx = repmat(1:pt_size,pt_size,1);
19            tmp1 = reshape(idx,pt_size*pt_size,1);
酚醛模塑料
20            tmp2 = reshape(idx',pt_size*pt_size,1);
21            pairs = [tmp1,tmp2];
生姜去皮机22            rnd = randseed(1,1000,1,1,pt_size*pt_size);
23            pairs = pairs(rnd,:);
24            Features = zeros(size(pairs,1),4);
25for i = 1:size(pairs,1)
26                Features(i,:) = ppf(self.ModelPointCloud.select(pairs(i,1)),...
27                                    self.ModelPointCloud.select(pairs(i,2)));
28            end
29            self.FeatureTree = createns(Features);
30            self.Pairs = pairs;
31        end
32    end
33 end
PFH
正如点特征表⽰法所⽰,表⾯法线和曲率估计是某个点周围的⼏何特征基本表⽰法。虽然计算⾮常快速容易,但是⽆法获得太多信息,因为它们只使⽤很少的⼏个参数值来近似表⽰⼀个点的k邻域的⼏何特征。然⽽⼤部分场景中包含许多特征点,这些特征点有相同的或者⾮常相近的特征值,因此采⽤点特征表⽰法,其直接结果就减少了全局的特征信息。本⼩节介绍三维特征描述⼦中的⼀位成员:点特征直⽅
图(Point Feature Histograms),我们简称为PFH,本⼩节将介绍它的理论优势,从PCL实现的⾓度讨论其实施细节。PFH特征不仅与坐标轴三维数据有关,同时还与表⾯法线有关。
理论基础
PFH计算⽅式通过参数化查询点与邻域点之间的空间差异,并形成⼀个多维直⽅图对点的k邻域⼏何属性进⾏描述。直⽅图所在的⾼维超空间为特征表⽰提供了⼀个可度量的信息空间,对点云对应曲⾯的6维姿态来说它具有不变性,并且在不同的采样密度或邻域的噪⾳等级下具有鲁棒性。点特征直⽅图(PFH)表⽰法是基于点与其k邻域之间的关系以及它们的估计法线,简⾔之,它考虑估计法线⽅向之间所有的相互作⽤,试图捕获最好的样本表⾯变化情况,以描述样本的⼏何特征。因此,合成特征超空间取决于每个点的表⾯法线估计的质量。如图1所⽰,表⽰的是⼀个查询点(Pq)的PFH计算的影响区
域,Pq⽤红⾊标注并放在圆球的中间位置,半径为r,(Pq)的所有k邻元素(即与点Pq的距离⼩于半径r的所有点)全部互相连接在⼀个⽹络中。最终的PFH描述⼦通过计算邻域内所有两点之间关系⽽得到的直⽅图,因此存在⼀个O(k)的计算复杂性。
图1  查询点 的PFH计算的影响区域
为了计算两点Pi和Pj及与它们对应的法线Ni和Nj之间的相对偏差,在其中的⼀个点上定义⼀个固定的局部坐标系,如图2所⽰。
图2 定义⼀个固定的局部坐标系
使⽤上图中uvw坐标系,法线和之间的偏差可以⽤⼀组⾓度来表⽰,如下所⽰:
d是两点Ps和Pt之间的欧⽒距离,。计算k邻域内的每⼀对点的四组值,这样就把两点和它们法线相关的12个参数(xyz坐标值和法线信息)减少到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);
有关其他详细信息,请见API⽂件。为查询点创建最终的PFH表⽰,所有的四元组将会以某种统计的⽅式放进直⽅图中,这个过程⾸先把每个特征值范围划分为b个⼦区间,并统计落在每个⼦区间的点数⽬,因为四分之三的特征在上述中为法线之间的⾓度计量,在三⾓化圆上可以将它们的参数值⾮常容易地归⼀到相同的区间内。⼀个统计的例⼦是:把每个特征区间划分成等分的相同数⽬,为此在⼀个完全关联的空间内创建有个区间的直⽅图。在这个空间中,⼀个直⽅图中某⼀区间统计个数的增⼀对应⼀个点的四个特征值。如图3所⽰,就是点云中不同点的点特征直⽅图表⽰法的⼀个例⼦,在某些情况下,第四个特征量d在通常由机器⼈捕获的2.5维数据集中的并不重要,因为临近点间的距离从视点开始是递增的,⽽并⾮不变的,在扫描中局部点密度影响特征时,实践证明省略d是有益的。
图3 点云中不同点的点特征直⽅图表⽰法
注意:更多相关信息和数学推导,包括不同⼏何体表⾯点云的PFH特征分析,请见。
估计PFH特征
点特征直⽅图(PFH)在PCL中的实现是模块的⼀部分。默认PFH的实现使⽤5个区间分类(例如:四个特征值中的每个都使⽤5个区间来统计),其中不包括距离(在上⽂中已经解释过了——但是如果有需要的话,也可以通过⽤户调⽤computePairFeatures⽅法来获得距离值),这样就组成了⼀个125浮点数元素的特征向量(35),其保存在⼀个pcl::PFHSignature125的点类型中。以下代码段将对输⼊数据集中的所有点估计其对应的PFH特征。
#include <pcl/point_types.h>                //点类型头⽂件
#include <pcl/features/pfh.h>                //pfh特征估计类头⽂件
...//其他相关操作
pcl::PointCloud<pcl::PointXYZ>::Ptrcloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::Normal>::Ptrnormals(new pcl::PointCloud<pcl::Normal>());
...//打开点云⽂件估计法线等
//创建PFH估计对象pfh,并将输⼊点云数据集cloud和法线normals传递给它
pcl::PFHEstimation<pcl::PointXYZ,pcl::Normal,pcl::PFHSignature125>pfh;
pfh.setInputCloud(cloud);
pfh.setInputNormals(normals);
//如果点云是类型为PointNormal,则执⾏pfh.setInputNormals (cloud);
//创建⼀个空的kd树表⽰法,并把它传递给PFH估计对象。
//基于已给的输⼊数据集,建⽴kdtree
pcl::KdTreeFLANN<pcl::PointXYZ>::Ptrtree(new pcl::KdTreeFLANN<pcl::PointXYZ>());
pfh.setSearchMethod(tree);
//输出数据集
pcl::PointCloud<pcl::PFHSignature125>::Ptrpfhs(new pcl::PointCloud<pcl::PFHSignature125>());
//使⽤半径在5厘⽶范围内的所有邻元素。
//注意:此处使⽤的半径必须要⼤于估计表⾯法线时使⽤的半径
pfh.setRadiusSearch(0.05);
//计算pfh特征值
pfhpute(*pfhs);
// pfhs->points.size ()应该与input cloud->points.size ()有相同的⼤⼩,即每个点都有⼀个pfh特征向量
PFHEstimation类的实际计算程序内部只执⾏以下:
对点云P中的每个点p
1.得到p点的最近邻元素
2.对于邻域内的每对点,计算其三个⾓度特征参数值
3.将所有结果统计到⼀个输出直⽅图中
使⽤下列代码,从⼀个k-邻域计算单⼀的PFH描述⼦:
computePointPFHSignature (const pcl::PointCloud<PointInT> &cloud,
const pcl::PointCloud<PointNT> &normals,
玻璃加工工艺const std::vector<int> &indices,
反光书包int nr_split,
Eigen::VectorXf&pfh_histogram);
此处,cloud变量是包含点的输⼊点云,normals变量是包含对应cloud的法线的输⼊点云,indices代表输⼊点云(点与法线对应)中查询点的k-近邻元素
集,nr_split是所分区间的数⽬,⽤于每个特征区间的统计过程,pfh_histogram是浮点数向量来存储输出的合成直⽅图。
FPFH
已知点云P中有n个点,那么它的点特征直⽅图(PFH)的理论计算复杂度是,其中k是点云P中每个点p计算特征向量时考虑的邻域数量。对于实时应⽤或接近实时应⽤中,密集点云的点特征直⽅图(PFH)的计算,是⼀个主要的性能瓶颈。本⼩节讲述PFH计算⽅式的简化形式,我们称为快速点特征直⽅图FPFH(Fast Point Feature Histograms)(更多详情,请见),FPFH把算法的计算复杂度降低到了,但是任然保留了PFH⼤部分的识别特性。
理论基础
为了简化直⽅图的特征计算,我们执⾏以下过程:
第⼀步,对于每⼀个查询点,计算这个点和它的邻域点之间的⼀个元组(参考上⼀节PFH的介绍),第⼀步结果我们称之为简化的点特征直⽅图SPFH(Simple Point Feature Histograms);
第⼆步,重新确定每个点的k邻域,使⽤邻近的SPFH值来计算的最终直⽅图(称为FPFH),如下所⽰:
上式中,权重在⼀些给定的度量空间中,表⽰查询点和其邻近点之间的距离,因此可⽤来评定⼀对点(,),但是如果需要的话,也可以把⽤另⼀种度量来表⽰。如图1所⽰可以帮助理解这个权重⽅式的
重要性,它表⽰的是以点为中⼼的k邻域影响范围。
图1 以点 为中⼼的k邻域影响范围图
因此,对于⼀个已知查询点,这个算法⾸先只利⽤和它邻域点之间对应对(上图中以红⾊线来说明),来估计它的SPFH值,很明显这样⽐PFH的标准计算少了邻域点之间的互联。点云数据集中的所有点都要执⾏这⼀计算获取SPFH,接下来使⽤它的邻近点的SPFH值和点的SPFH值重新权重计算,从⽽得到点的最终FPFH值。FPFH计算添加的计算连接对,在上图中以⿊⾊线表⽰。如上图所⽰,⼀些重要对点(与直接相连的点)被重复计数两次(图中以粗线来表⽰),⽽其他间接相连的⽤细⿊线表⽰。

本文发布于:2024-09-22 18:23:47,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/218653.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:特征   计算   邻域
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议