PCL教程指南-PFH与FPFH特征描述子

更新时间:2023-07-14 07:11:14 阅读: 评论:0

PCL 教程指南-PFH 与FPFH 特征描述⼦
PCL 教程指南-PFH 与FPFH 特征描述⼦两种描述⼦主要思想是利⽤局部邻域内点之间的⾓度距离特征组成直⽅图的思想,具体原理⽂档和相关论⽂有详解
注释⽂档代码,并扩展其中⽤法
1.PFH
#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 ) ...
//PFH 估计类,其中pcl::PFHSignature125为输出类型为直⽅图数据
pcl ::PFHEstimation <pcl ::PointXYZ , pcl ::Normal , pcl ::PFHSignature125> pfh ;
pfh .tInputCloud (cloud );
pfh .tInputNormals (normals );
//根据点云类型不同,⽐如可使⽤pointNormal 类型,则 pfh.tInputNormals (cloud);
// Kdtree 搜索类,直接设置给pfh 类班主任培训计划
// 搜索直接按照pfh 内部数据计算
pcl ::arch ::KdTree <pcl ::PointXYZ >::Ptr tree (new  pcl ::arch ::KdTree <pcl ::PointXYZ > ());
//pcl::KdTreeFLANN<pcl::PointXYZ>::Ptr tree (new pcl::KdTreeFLANN<pcl::PointXYZ> ()); -- older call for PCL 1.5-
pfh .tSearchMethod (tree );
// 输出结果集,即每个点都对应⼀个125个向量数据
pcl ::PointCloud <pcl ::PFHSignature125>::Ptr pfhs (new  pcl ::PointCloud <pcl ::PFHSignature125> ());
// 设置半径,⽤于fph 邻域计算
// 注意: 这个半径必须⼤于估计法线时的搜索半径
pfh .tRadiusSearch (0.05);
// 计算pfh 特征
pfh .compute (*pfhs );
// pfhs->size () should have the same size as the input cloud->size ()*}其中pcl::PFHSignature125为直⽅图输出结果类型,125的含义是 这个类中特征选取了三个⾓度值,⽽没有距离信息(需要距离信息需要computePairFeatures⽅法计算),且⾓度在构建直⽅图时默认采⽤了5个间隔(bin),通俗来讲就是 有三个⾓度,每个⾓度有5份,穷举可能出现的结果构建直⽅图,即每个⾓度选⼀份出来组成⼀块,排列组合A  * A  * A
即⽂档中所说的5 * 5 * 5=5^3有时需要单独求某两点的特征信息,或者只求⼀个点的pfh特征,pcl提供了以下两种⽅法
151515
//计算两点之间的三个⾓度和⼀个距离信息
bool pcl::PFHEstimation< PointInT, PointNT, PointOutT >::computePairFeatures (
const pcl::PointCloud< PointInT >&  cloud,//输⼊包含这两点的点云指针
const pcl::PointCloud< PointNT >&  normals,//输⼊点云的法向指针
int  p_idx,//输⼊点1索引
int  q_idx,//输⼊点2索引
float&  f1,//输出 nq_idx 和 u的投影⾓度
float&  f2,//输出 nq_idx 和 v的⾓度
float&  f3,//输出  np_idx 和 |p_idx - q_idx|的⾓度
幸福100
float&  f4 //输出距离
)
//计算某个点的pfh⾓度特征数据
void pcl::PFHEstimation< PointInT, PointNT, PointOutT >::computePointPFHSignature (
const pcl::PointCloud< PointInT >&  cloud,//点云
const pcl::PointCloud< PointNT >&  normals,//法向
const pcl::Indices &  indices,// 某点的邻域内所有点的索引
int  nr_split,//⾓度数据的分割数⽬ (bin数)
Eigen::VectorXf &  pfh_histogram //输出的pfh向量即如果bin是5,那么输出含125个数据的向量
)
2.FPFH
相⽐PFH,FPFH为了计算快速,计算时没有使⽤邻域⽹络交叉计算,⽽是通过邻域各点的SPFH加权得到结果。
SPFH即针对某点,只计算此点与邻域间的特征⾓度和距离信息,不必计算邻域内点间的特征信息。
#include<pcl/point_types.h>
#include<pcl/features/fpfh.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)...
// FPFH估计类,其中pcl::FPFHSignature33为输出类型为直⽅图数据
pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> fpfh;
fpfh.tInputCloud (cloud);
fpfh.tInputNormals (normals);
//以下类似于FPH代码
pcl::arch::KdTree<PointXYZ>::Ptr tree (new pcl::arch::KdTree<PointXYZ>);
辞职报告图片
fpfh.tSearchMethod (tree);
//输出结果
pcl::PointCloud<pcl::FPFHSignature33>::Ptr fpfhs (new pcl::PointCloud<pcl::FPFHSignature33>());
fpfh.tRadiusSearch (0.05);
// fpfhs->size () should have the same size as the input cloud->size ()*
}
折纸手工制作大全
其中pcl::FPFHSignature33,33的含义是3个⾓度,默认分割11份,不像PFH125那样穷举,⽽是直接独⽴拼凑到⼀起,即11+11+11=33
类⽐PFH单独计算特征信息的⽅法FPFH同样实现了,类似⽅法不再赘述
//计算两点间相关特征值
bool  computePairFeatures (const pcl::PointCloud< PointInT >&cloud,const pcl::PointCloud< PointNT >&normals,int p_idx,int q_idx,float&f1,float&f2,fl oat&f3,float&f4)
//计算某点的SPFH,返回各⾓度特征的矩阵形式;⽐如计算第⼀个点row=0,那么矩阵只有第⼀⾏有值,以此类推
void pcl::FPFHEstimation< PointInT, PointNT, PointOutT >::computePointSPFHSignature (
const pcl::PointCloud< PointInT >&  cloud,
const pcl::PointCloud< PointNT >&  normals,
int  p_idx,//查询点索引
int  row,//矩阵的第⼏⾏,具体的⾏指邻域内SPFH计算所在的点,row则指查询点邻域内第row个点
const std::vector<int>&  indices,//邻域索引
Eigen::MatrixXf &  hist_f1,//输出 f1的直⽅图矩阵
Eigen::MatrixXf &  hist_f2,//输出 f2的直⽅图矩阵
浩浩荡荡的意思Eigen::MatrixXf &  hist_f3 //输出 f3的直⽅图矩阵
)
//加权SPFH求得单点的FPFH (此⽅法甚⽤!,他是配合PCL源码所⽤,单独使⽤需要注意indeices参数!)
void pcl::FPFHEstimation< PointInT, PointNT, PointOutT >::weightPointSPFHSignature (
华盛顿英文
const Eigen::MatrixXf &  hist_f1,//输⼊ f1邻域各点的直⽅图矩阵
const Eigen::MatrixXf &  hist_f2,//输⼊ f2邻域各点的直⽅图矩阵
const Eigen::MatrixXf &  hist_f3,//输⼊ f3邻域各点的直⽅图矩阵
//
******源码中此⽅法以indices中的值当作hist_f1,2,3的⾏索引即⽤了邻域点在点云中的索引数,显然直接使⽤会出错**********
******此⽅法在源码使⽤时,增加了⼀个过渡⽅法computeSPFHSignatures,保存了邻域点在点云的索引和在矩阵中⾏索引的映射向量**********
const std::vector<int>&  indices,//输⼊邻域索引
//
const std::vector<float>&  dists,//输⼊与邻域间距离
Eigen::VectorXf &  fpfh_histogram
)
******源码中的过渡⽅法computeSPFHSignatures**********
//计算全局索引indices_,即提前设置的tIndex需要计算特征的点,映射向量和特征矩阵
void pcl::FPFHEstimation< PointInT, PointNT, PointOutT >::computeSPFHSignatures (
std::vector<int>&  spf_hist_lookup,//输出邻域点在点云的索引和在矩阵中⾏索引的映射向量
Eigen::MatrixXf &  hist_f1,//输出
Eigen::MatrixXf &  hist_f2,//输出
Eigen::MatrixXf &  hist_f3 //输出
)
说明:PCL提供的其他⽅法,主要是为了⽅便代码组织,封装了各种功能的⼩⽅法,本质就是⽅法的互相调⽤简化代码使得更加清晰,不过因为继承的关系,想要理清这些⽅法的作⽤,需要明确PCL的模块的继承组织结构,单独使⽤时需谨慎。综上,FPFH提供的⼩⽅法过于耦合不建议⽤户单独使⽤
(PCL为了⽤户使⽤⽅便,不难发现特征计算都最后使⽤了compute⽅法,他则是统⼀重写,其中就是调⽤了内部的各种⼩⽅法,使得⽤户不管计算什么特征,代码都是类似的,体现了多态的好处)
相⽐PFH类,FPFH类提供了⽤户⾃定义分割Bin数量⽅法
/
绿曼巴蛇/三个⾓度可⾃定义BIN数量
void pcl::FPFHEstimation< PointInT, PointNT, PointOutT >::tNrSubdivisions (
int  nr_bins_f1,
林书豪长高方法int  nr_bins_f2,
int  nr_bins_f3
)

本文发布于:2023-07-14 07:11:14,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1080867.html

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

标签:计算   特征   邻域   需要   信息   距离   代码   结果
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图