我正在使用名为Point Cloud Library(PCL)的库。特别是我试图计算点特征直方图。我在网站上关注了这段代码:
#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 ()*
}
我得到的输出是来自原始点云的每点125个值的数组。例如,如果我有一个1000点的点云,其中每个点包含XYZ,那么将有1000 * 125个值。我能够理解为什么我有125个条目,每个条目对应一个bin。 (假设3个特征和5个分区5 ^ 3 = 125)
这篇文章帮助了一些人:PCL Point Feature Histograms - binning
不幸的是我还有几个问题:
1)为什么每个点有125个直方图?是因为它测量了当前点的K-最近邻域中具有相似特征的点的百分比,然后每个点都有自己的邻域?
2)我看到一些点,所有125个条目都是零。为什么呢?
3)绘制点特征直方图值,如论文和网站所示:
网站: http://pointclouds.org/documentation/tutorials/pfh_estimation.php#pfh-estimation
纸张: https://pdfs.semanticscholar.org/5aee/411f0b4228ba63c85df0e8ed64cab5844aed.pdf
显示的图表的X轴为箱数(在我的情况下为125箱)所以自然的问题是如何将每个点的125个值合并到一个图表中? 我尝试了对适当列进行简单求和并按常量进行缩放,但我不认为这是正确的。通过求和,我的意思是为每个点添加所有bin [0],然后为每个点加上所有bin [1],依此类推,直到bin [124]。
我真的很感激任何帮助澄清这一点。 谢谢。
答案 0 :(得分:1)
PFH描述符是本地描述符,因此会为给定的每个点计算直方图。您可能只想使用关键点或一组kepypoints。
如果直方图在半径搜索中没有最近邻居,则条目的条目为0。
对于绘图,请尝试一次查看一个点的直方图。我不认为将它合并到一个图表中是有意义的。
如果您对考虑所有点的全局描述符感兴趣,请查看CVFH描述符(Clustered Viewpoint Feature Histogram)或其他全局描述符。