欢迎点云相关产学研的学者和团体加入我们。
本小节演示如何从一个深度图像中提取NARF特征点位置的NARF特征描述子。可执行程序能够从磁盘中加载一个点云(如果用户没有给定,则自动创建随机点云),从中提取特征点,然后在这些位置估算特征描述子,接着在一个深度图像和三维视图中可视化这些特征点位置。
首先,在PCL(Point Cloud Learning)中国协助发行的书[1]提供光盘的第12章例3文件夹中,打开名为narf_feature_extraction.cpp的代码文件,同文件夹下可以找到相关的测试点云文件table_scene_mug_stereo_textured.pcd。
下面解析打开源代码中的关键语句,首先我们解析命令行参数,从磁盘中读取一个点云(如果没有给出则自行创建一个点云),然后创建一个深度图像并从中提取NARF关键点,所有这些步骤在之前的NARF关键点提取中已经涉及到了。
...//注意此处keypoint_indices为点云对象
std::vector<int> keypoint_indices2;
keypoint_indices2.resize(keypoint_indices.points.size());
for (unsignedint i=0; i<keypoint_indices.size(); ++i)
//要得到正确的向量类型,这一步是必要的
keypoint_indices2[i]=keypoint_indices.points[i];
...
此处,我们建立NARF关键点的索引的向量,此矢量作为NARF特征计算的输入来使用。
...
pcl::NarfDescriptor narf_descriptor(&range_image, &keypoint_indices2);
narf_descriptor.getParameters().support_size = support_size;
narf_descriptor.getParameters().rotation_invariant = rotation_invariant;
pcl::PointCloud<pcl::Narf36> narf_descriptors;
narf_descriptor.compute(narf_descriptors);
cout <<"Extracted "<<narf_descriptors.size()<<" descriptors for "<<keypoint_indices.points.size()<<" keypoints.\n";
...
这段代码实现了NARF描述子的计算,它首先创建了NarfDescriptor对象,并给了此对象输入数据(特征点索引和深度图像),然后设置两个重要的参数,Support size确定了计算描述子时考虑的区域大小,在此区域内的点用来估算查询关键点的描述子,如果设置旋转不变(围绕法线旋转),则应该使用旋转不变的NARF描述子的版本,然后我们创建Narf36的点类型输出点云对象并进行实际计算,最后,打印输出特征点的数目和提取的描述子的数目。这两个数目有可能不同,一方面,特征点的描述子的估算可能失败,因为深度图像中有可能没有足够多的点(分辨率太低)进行计算某些特征点的描述子,或者在同一地方可能会有多个描述子,但是针对不同的主旋转(dominant rotations),生成的点云类型是Narf36类型(见common/include/pcl/point_types.h),是由36个浮点数元组成的描述子,以及x,y,z,roll,pitch,yaw来描述局部坐标系,在此坐标系中计算相应的特征值。后续就可以基于描述子进行比较分析做相应的配准识别等应用处理,例如:使用Manhatten 距离(绝对误差和)进行对比等。剩余的代码只是在RangeImageVisualizer对象和PCLVisualizer对象中对特征点位置进行可视化。
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成执行文件后,就可以运行了,在cmd中键入命令:
...>narf_feature_extraction.exe -m
如图1最下面的图所示,这将自动生成一个呈矩形的点云,检测的特征点处在角落处。参数-m是必要的,因为矩形周围的区域观测不到,但属于边界部分,因此系统无法检测到这部分区域的特征点,选项-m将看不到的区域改变到最大范围读取,从而使系统能够使用这些边界区域。你也可以用硬盘驱动器中的一个点云文件来进行测试:
...>narf_feature_extraction.exe <point_cloud.pcd>
输出结果如图1上面两个图所示,在三维视窗和二维深度图像视窗中,特征点以不同的显示方式凸显出来,可以直观的看到特征点的位置分布在空间物体的边沿处或空间变化明显的区域。
图1 NARF特征点检测可视化
敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。
参考文献:
1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社 2012-10