欢迎点云相关产学研的学者和团体加入我们。
首先,在PCL(Point Cloud Learning)中国协助发行的书[1]本书提供光盘的第12章例4文件夹中,打开名为fpfh_radius.cpp的代码文件,同文件夹下可以找到相关的测试点云和对应的真值变换矩阵数据。
下面对打开的源代码进行解析,首先是基准测试的头文件声明语句。
#include
#include
#include
下面语句打印帮助信息,告诉用户输入点云文件、真值变换矩阵文件、测试参数文件。
std::cout <<"Specify the input cloud, ground truth and parameter files:\n";
std::cout <<" "<<argv[0] <<" input_cloud.pcd ground_truth.txt parameters.txt\n";
下面代码定义测试对象test_features,后续的代码设置测试所需的参数设置。
pcl::FeatureEvaluationFramework<pcl::PointXYZRGB> test_features;
test_features.setFeatureTest ("FPFHTest"); //设置测试的特征算子种类
test_features.setGroundTruth (argv[2]); //设置真值文件
//如果设置target-cloud文件的参数为"",那么source-cloud经过真值变换矩阵转换得到target-cloud
test_features.setInputClouds (argv[1], "", argv[1]); //设置源和目标点云
test_features.setThreshold (0.1f,1.0f,0.1f); //设置阈值
//独立变量不需要被分别设置,它的值将从文件中读取,在这里独立变量为搜索半径
//std::string parameters = "searchradius=0.05";
//test_features.setParameters (parameters);
test_features.setDownsampling (true); //测试时对点云进行下采样
test_features.setLeafSize (0.01f); //设置叶子大小
test_features.setVerbose (true); //设置打印出过程信息
test_features.setLogFile ("fpfh-radius-variation.txt"); //设置保存结果到该文件
test_features.runMultipleParameters (argv[3]);//设置用很多个不同的半径进行测试
test_features.clearData ();
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成执行文件后,执行前,首先创建一个文本文件,这个文件中包含独立变量值(在这里为搜索半径),把它命名为“radius-values.txt”:
searchradius=0.05
searchradius=0.07
searchradius=0.1
searchradius=0.15
同时,你需要一个输入点云(假设命名为cloud_000.pcd)以及包含真值变换矩阵的一个文件(假设命名为pose_000.txt),这些文件都在源码文件夹中包含。假设它们与可执行文件在同一目录下,执行以下命令(否则需要给文件提供相对路径):
...>fpfh_radius.exe cloud_000.pcd pose_000.txt radius-values.txt
在特征描述子提取的测试过程中,应该在控制台上看到类似如图12-所示的输出,输入信息详细的打印出测试过程中的每个步骤,例如设置输入参数、计算步骤、计算中所需的时间、以及统计结果,这些信息同样的以一定的格式保存到相应的日志文件中,详细请参照下一小节。
Set input clouds
Set ground truths
Set threshold
Perform downsampling
Set parameters
----------Test Details:----------
打开输出日志文件“fpfh-radius-variation.txt”,你应该看到类似这样的内容:
searchradius=0.05,1.95,2.39,4.72
0.1,85
0.2,14326
...
searchradius=0.07,3.45,4.25,8.26
0.1,76
...
每个数据块对应一个特定的测试,第一行指定了算法参数,在这里为搜索半径,源点云的特征计算的时间,目标点云的特征计算时间和特征计算的总时间。接下来有一组值,每一对都是(threshold, successes)。对于每一个阈值,successes的数值表示目标点云中的对应点和三维空间中此点的真值位置之间的距离小于阀值的点的数目,源点云与目标点云的对应关系是通过,在n-D特征空间进行最近邻搜索,来估算得到的。在较低的阈值限定下,估计对应点对的成功次数,是特征描述子算法的衡量指标。这里,在一个特定的阈值0.2下,随着搜索半径的增大,successes数值单调递增,特征描述子估算所占用的时间也同样递增。
对于高级用户可能有自己实现的描述子算法,想进行与其他现有描述子算法的比较,需要实现自己描述子算法在此测试框架下的类,其实增加新特征描述子算法到测试框架是非常简单:需要从FeatureCorrespondenceTest基类中派生出一个新的子类,并实现以下成员函数:
l setParameters (ParameterList params)
此处,ParameterList是一个map
l computeFeatures (double& time_source, double& time_target)
这个函数应该执行源点云和目标点云特征描述子的实际计算,根据不同的问题对应的算法实现设计也不同。参数time_source,和time_target通过引用参数传递方式,应该分别用来存储源点云和目标点云特征描述子计算所占用的时间。
l computeFeatures ()
同上,不同的是:不对运行时间进行统计回传。
l computeCorrespondences ()
对于每一个源点云中的点,在n-D特征空间中,利用该点的特征描述子向量,从目标点云特征描述子集合中计算它的近邻元素来确定该点在目标点云中对应点对,并在MapSourceToTargetIndices存储对应关系。
详细可参考FPFHTest实现(in/trunk/features/include/pcl/features/feature_evaluation),用户可以参照其实现来进行更改以适应自己的描述子。
敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。
参考文献:
1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社 2012-10
编译运行程序
如何理解输出的结果日志文件
给基准测试框架增加新特征描述算子算法