欢迎点云相关产学研的学者和团体加入我们。
本小节展示如何从距离图像中提取NARF关键点,可执行文件使我们能够从磁盘上加载点云(如果没有的话就创建随机点云),提取上面特征点,并且用图像和3D显示方式进行可视化,用户可直观的观察到关键点的位置和数量。
首先,在PCL(Point Cloud Learning)中国协助发行的书提供光盘的第10章例1文件夹中,打开名为narf_keypoint_extraction.cpp的代码文件,同文件夹下可以找到相关的测试点云文件frame_00000.pcd。
开始我们先进行命令行参数分析,从磁盘读取一个点云(若不存在就创建一个),创建一个深度图像并进行可视化,可视化相关的内容可参考可视化章节。关键的部分如下:
...
pcl::RangeImageBorderExtractorrange_image_border_extractor;
pcl::NarfKeypointnarf_keypoint_detector(&range_image_border_extractor);
narf_keypoint_detector.setRangeImage(&range_image);
narf_keypoint_detector.getParameters().support_size=support_size;
//narf_keypoint_detector.getParameters ().add_points_on_straight_edges = true;
//narf_keypoint_detector.getParameters ().distance_for_additional_points = 0.5;
pcl::PointCloud<int>keypoint_indices;
narf_keypoint_detector.compute(keypoint_indices);
std::cout<<"Found "<<keypoint_indices.points.size()<<" key points.\n";
...
这里创建了一个RangeImageBorderExtractor对象,它是用来进行边缘提取的,因为NARF的第一步就是需要探测出深度图像的边缘,本例中我们只使用RangeImageBorderExtractor对象的默认参数,然后创建NarfKeypoint对象,把RangeImageBorderExtractor对象和深度图像传递给它,设置所支持的范围(搜索空间球体的半径,它指定计算感兴趣值的测度时所使用的邻域范围),注释掉的部分包含一些可以设置的其他参数,用户可更改体验关键点结果的变化。接下来我们创建点云对象,来存储探测得到的关键点,这里所确定的关键点被保存到该点云对象,最后一步中我们输出所找到的关键点的数目,剩下的代码仅仅将结果用深度图像widget和3D窗口来可视化。
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成执行文件后,就可以运行了,在cmd中键入命令:
...>narf_keypoint_extraction.exe -m
这将使用一个由程序自动生成的矩形组成的点云,在角落的特征点可以检测到,参数-m是必须的,因为矩形周围的区域对模拟的深度图像是不可见区域,因此系统不能够对它进行正常检测,选项-m把不可见区域变成最大范围读数,这样使得系统能够使用这些边界,从而探测矩形的角点,运行结果如图1所示,分别为由程序生成的矩形点云对应的深度图像以及探测得到的NARF关键点示意图,NARF关键点用较大的绿色点显示。
你也可以用你的硬盘驱动器上的点云文件尝试一下:
...>narf_keypoint_extraction.exe
输出大致如图2所示,与无输入点云的情况基本一样,只是点云和对应的关键点不同而已。
图1无输入点云时提取NARF关键点输出结果
图2 有输入点云时提取NARF关键点输出结果
敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。
参考文献:
1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社 2012-10