1.Class pcl::Keypoint< PointInT, PointOutT >
类Keypoint是所有关键点检测相关类的基类,定义基本接口,具体实现由子类来完成。
#include <pcl/2d/keypoint.h>
void harrisCorner (ImageType &output, ImageType &input, const float sigma_d, const float sigma_i, const float alpha, const float thresh)
void hessianBlob (ImageType &output, ImageType &input, const float sigma, bool SCALE)
void hessianBlob (ImageType &output, ImageType &input, const float start_scale, const float scaling_factor, const int num_scales)
void imageElementMultiply (ImageType &output, ImageType &input1, ImageType &input2)
Keypoint ()
// 构造函数
virtual ~Keypoint ()
// 析构函数
virtual void setSearchSurface (const PointCloudInConstPtr &cloud)
// 设置搜索时所用搜索点云, cloud为指向点云对象的指针引用。
PointCloudInConstPtr getSearchSurface ()
// 获得搜索时所用搜索点云指针。
void setSearchMethod (const KdTreePtr &tree)
// 设置内部算法实现时所用的搜索对象, tree为指向kdtree或octree对应的指针引用。
KdTreePtr getSearchMethod ()
// 获得内部算法实现时所用的搜索对象。
double getSearchParameter ()
// 获取内部搜索参数。
void setKSearch (int k)
// 设置k近邻搜索时所用的k参数。
int getKSearch ()
// 获得k近邻搜索时所用的k参数。
void setRadiusSearch (double radius)
// 设置半径搜索时所用的半径radius参数。
double getRadiusSearch ()
// 获得半径搜索时所用的半径radius参数。
pcl::PointIndicesConstPtr getKeypointsIndices ()
// 获得关键点索引
void compute (PointCloudOut &output)
// 执行关键点检测,检测结果保存在output中。
int searchForNeighbors (int index, double parameter, std::vector< int > &indices, std::vector< float > &distances) const
// 采用setSearchMethod设置的搜索对象﹐以及 setSearchSurface设置的搜索点云,进行近邻搜索,返回近邻在点云中的索引向量indices,以及对应的距离向量dis-tance,其中 index为查询点的索引, parameter为搜索时所用的参数半径radius或者k。
void setInputCloud (const PointCloudConstPtr &cloud)
// 设置输入点云,cloud为指向点云的指针引用,要求不能被函数内部改变。
void setIndices (const IndicesPtr &indices)
// 与setInputCloud配合使用, indices为指向点云索引向量的指针引用,如果设置了此函数则算法的输入点云为indices中索引向量指定的点云集合,否则为setInput-Cloud设置的整个输入点云。
void setIndices (const IndicesConstPtr &indices)
// 同上,只是要求indices不能被函数改变。
void setIndices (const PointIndicesConstPtr &indices)
// 同上,但indices是 PointIndices 的结构体链表,可以看做是点云索引向量指针的链表理解。
void setIndices (size_t row_start,size_t col_start,size_t nb_rows,size_t nb_cols)
// 与setInputCloud配合使用,此函数只限于有序点云,如果设置了此函数则算法的输入点云为第row_start行,第 col_start列开始, nb_rows行和nb_cols列限定的矩形区域所覆盖的点云,否则为setInputCloud设置的整个输入点云。
2.Class pcl::HarrisKeypoint2D< PointInT, PointOutT, IntensityT >
类HarrisKeypoint2D实现基于点云的强度字段的 harris关键点检测子,其中包含了多种不同的harris关键点检测算法的变种,例如由JA Noble,Lowe、Tomasi等提出的Harris关键点检测算法。
#include <pcl/keypoints/harris_2d.h>
HarrisKeypoint2D (ResponseMethod method=HARRIS, int window_width=3, int window_height=3, int min_distance=5, float threshold=0.0)
// 重构函数, method设置需要采用那种关键点检测方法,有HARRIS,NOBLE,LOWE,TOMASI 四种方法﹐默认为HARRIS, window_width , window_height为检测窗口的宽度和高度,min_distance为两个关键点之间允许的最小距离, threshold为判断是否为关键点的感兴趣程度的阈值,小于该阈值的点被忽略,大于的则认为是关键点。
void setMethod (ResponseMethod type)
// 设置检测方法。
void setWindowWidth (int window_width)
// 设置检测窗口宽度。
void setWindowHeight (int window_height)
// 设置检测窗口高度。
void setSkippedPixels (int skipped_pixels)
// 设置在检测时每次跳过的像素数目。
void setMinimalDistance (int min_distance)
// 设置候选关键点之间的最小距离。
void setThreshold (float threshold)
// 设置感兴趣阈值。
void setNonMaxSupression (bool=false)
// 设置是否对小于感兴趣阈值的点进行剔除,如果为true则进行剔除,对结果进行优化,如果为false则返回每个点,无论其感兴趣值大于或小于感兴趣阈值。
void setRefine (bool do_refine)
// 设置是否对所得关键点结果进行重新计算优化。
void setNumberOfThreads (unsigned int nr_threads=0)
// 设置该算法如果采用OpenMP并行机制﹐能够创建的线程数目。
void compute (PointCloudOut &output)
// 计算获取关键点,存储在output中。
3.Class pcl::HarrisKeypoint3D< PointInT, PointOutT, NormalT >
类HarrisKeypoint3D和 HarrisKeypoint2D类似,但是它没有在点云的强度空间检测关键点,而是利用点云的3D空间的信息表面法线向量来进行关键点检测。
#include <pcl/keypoints/harris_3d.h>
HarrisKeypoint3D (ResponseMethod method=HARRIS, float radius=0.01f, float threshold=0.0f)
// 重构函数, method设置需要采用哪种关键点检测方法,有HARRIS,NOBLE,LOWE,TOMASI,CURVATURE五种方法﹐默认为HARRIS,radius为法线估计的搜索半径,同时也是计算兴趣值的支持区域, threshold为判断是否为关键点的感兴趣程度的阈值,小于该阈值的点被忽略,大于的则认为是关键点。
virtual ~HarrisKeypoint3D ()
// 空析构函数
virtual void setInputCloud (const PointCloudInConstPtr &cloud)
// 设置输入点云,cloud为指向点云的指针引用,要求不能被函数内部改变。
void setMethod (ResponseMethod type)
// 设置检测方法。
void setRadius (float radius)
// 设置法线估计的搜索半径。
void setThreshold (float threshold)
// 设置判断是否为关键点的感兴趣程度的阈值。
void setNonMaxSupression (bool=false)
// 设置是否对小于感兴趣阈值的点进行剔除,如果为true则进行剔除,对结果进行优化,如果为false则返回每个点,无论其感兴趣值大于或小于感兴趣阈值。
void setRefine (bool do_refine)
// 设置是否对所得关键点结果进行重新计算优化。
void setNormals (const PointCloudNConstPtr &normals)
// 如果预计算法线可用,则设置法线。
virtual void setSearchSurface (const PointCloudInConstPtr &cloud)
// 设置搜索时所用搜索点云, cloud为指向点云对象的指针引用。
void setNumberOfThreads (unsigned int nr_threads=0)
// 设置该算法如果采用OpenMP并行机制﹐能够创建的线程数目。
4.Class pcl::HarrisKeypoint6D< PointInT, PointOutT, NormalT >
类HarrisKeypoint6D与 HarrisKeypoint2D类似,只是利用了欧氏空间域XYZ或者强度域来确定候选关键点,或者前两者的交集,即同时满足XYZ域和强度域的关键点为候选关键点。
#include <pcl/keypoints/harris_6d.h>
HarrisKeypoint6D (float radius=0.01, float threshold=0.0)
// 重构函数,注意此处并没有方法选择的参数,通过源代码可以看出其只采用To-masi 提出的方法实现关键点检测, radius为法线估计的搜索半径,同时也是计算兴趣值的支持区域, threshold为判断是否为关键点的感兴趣程度的阈值,小于该阈值的点被忽略,大于的则认为是关键点。
virtual ~HarrisKeypoint6D ()
// 空析构函数
void setRadius (float radius)
// 设置法线估计的搜索半径。
void setThreshold (float threshold)
// 设置判断是否为关键点的感兴趣程度的阈值。
void setNonMaxSupression (bool=false)
// 设置是否对小于感兴趣阈值的点进行剔除,如果为true则进行剔除,对结果进行优化,如果为false则返回每个点,无论其感兴趣值大于或小于感兴趣阈值。
void setRefine (bool do_refine)
// 设置是否对所得关键点结果进行重新计算优化。
virtual void setSearchSurface (const PointCloudInConstPtr &cloud)
// 设置搜索时所用搜索点云, cloud为指向点云对象的指针引用。
void setNumberOfThreads (unsigned int nr_threads=0)
// 设置该算法如果采用OpenMP并行机制﹐能够创建的线程数目。
5.Class pcl::NarfKeypoint
类NarfKeypoint实现提取NARF(Normal Aligned Radial Feature)关键点,输入为一副深度图像,输出为NARF关键点,该类检测到的NARF常与NARF点特征描述子配合使用,以便后期配准、识别等应用,详细请参考文献[NARF:3D RangeImage Features for Object Recognition]。。
#include <pcl/keypoints/narf_keypoint.h>
NarfKeypoint (RangeImageBorderExtractor *range_image_border_extractor=NULL, float support_size=-1.0f)
// 重构函数, range_image_border_extractor是对深度图像进行边缘检测的对象指针,默认为空,support_size为检测是用支持域的大小。
virtual ~NarfKeypoint ()
// 析构函数
void clearData ()
// 删除与当前深度图像计算所得到的相关数据。
void setRangeImageBorderExtractor (RangeImageBorderExtractor *range_image_border_extractor)
// 设置range_image_border_extractor是对深度图像进行边缘检测的对象指针,此项在计算之前必须设置。
RangeImageBorderExtractor * getRangeImageBorderExtractor ()
// 获得对深度图像进行边缘检测的对象指针。
void setRangeImage (const RangeImage *range_image)
// 设置输入的深度图像。
float * getInterestImage ()
// 获取深度图像中每个点的感兴趣值。
const ::pcl::PointCloud< InterestPoint > & getInterestPoints ()
// 获取深度图像中关键点,返回对象InterestPoint中存储了点以及改点对应的感兴趣值。
const std::vector< bool > & getIsInterestPointImage ()
// 返回的布尔值向量中包含整幅深度图像各个点是否为关键点,深度图像中为关键点的设置为true,否则设置为false。
Parameters & getParameters ()
// 获取 Parameters结构体对象引用,其中存储了与Narf关键点提取算法的很多参数:
float support_size
// 检测关键点的支持区域。
int max_no_of_interest_points
// 返回关键点数目的上限。
float min_distance_between_interest_points
// 关键点之间的最小距离,影响支持区域。
float optimal_distance_to_high_surface_change
// 关键点与表面特征变化大的位置之间的距离。
float min_interest_value
// 候选关键点感兴趣值下限。
float min_surface_change_score
// 候选关键点表面特征变化大小下限。
int optimal_range_image_patch_size
// 计算每个关键点时考虑的距离图像大小(像素)。
float distance_for_additional_points
// 所有与最大兴趣值点之间距离在distance_for_additional_points之内的点,只要感兴趣值大于min_interest_value,该点则成为关键点候选点。
bool add_points_on_straight_edges
// 如果该值设置为true,则在空间直的边缘处添加关键点,表示空间曲面变化大。
bool do_non_maximum_suppression
// 如果该值设置为false,只要大于min_interest_value兴趣值的点都会被加入到关键点队列。
bool no_of_polynomial_approximations_per_point
// 如果该值设置为true,则对于每个关键点的位置,需要采用双变量多项式插值获取,这样获取的位置更精确。
int max_no_of_threads
// 采用OpenMP机制时,设置的建立线程数的上限。
bool use_recursive_scale_reduction
// 如果设置为真,距离图像在小范围内有多个关键点,则调整小分辨率,加快计算速度。
bool calculate_sparse_interest_image
// 使用启发式机制,自适应调整那些距离图像区域不需要计算关键点,从而加快计算速度。
const RangeImage & getRangeImage ()
// 获得range_image_border_extractor_的深度图像。
void compute (PointCloudOut &output)
// 计算获取关键点,存储在output中。
6.Class pcl::SIFTKeypoint< PointInT, PointOutT >
类SIFTKeypoint是将二维图像中的SIFT算子调整后移植到3D空间的SIFT算子的实现。输入为带有XYZ坐标值和强度的点云,输出为点云中的SIFT关键点,关于SIFT算子详细请参考文献[Distinctive image features from scale - invari-ant keypoints]。
#include <pcl/keypoints/sift_keypoint.h>
SIFTKeypoint ()
// 构造函数
void setScales (float min_scale, int nr_octaves, int nr_scales_per_octave)
// 设置搜索时与尺度相关参数, min_scale在点云体素尺度空间中标准偏差,点云对应体素栅格中体素的最小尺寸,nr_octaves是检测关键点时体素空间尺度的数目,nr_scales_per_octave为在每一个体素空间尺度下计算高斯空间的尺度时所需的参数。
void setMinimumContrast (float min_contrast)
// 设置候选关键点应有的对比度下限。
void compute (PointCloudOut &output)
// 计算获取关键点,存储在output中。
7.Class pcl::UniformSampling< PointT >
类UniformSampling实现对点云的统一重采样,具体通过建立点云的空间体素栅格,然后在此基础上实现下采样并且过滤一些数据。所有采样后得到的点用每个体素内点集的重心近似,而不是用每个体素的中心点近似,前者速度较后者慢,但其估计的点更接近实际的采样面。
#include <pcl/filters/uniform_sampling.h>
UniformSampling ()
// 构造函数
virtual ~UniformSampling ()
// 析构函数
virtual void setRadiusSearch (double radius)
// 设置三维栅格叶片大小。
void filter (PointCloudOut &output)
// 计算并输出经过下采样得到的点云,存储到output。