欢迎点云相关产学研的学者和团体加入我们。
创建一个PCLVisualizer对象,并建立一组视口(即将窗口分成不同的几个视口),用下面的语句可以做到,
p.createViewPort (l *x_step, m *y_step, (l +1) *x_step, (m +1) *y_step, viewport);
在loadFileList函数中,使用前面存储的模型文件列表,加载所有模型文件。
sensor_msgs::PointCloud2 cloud;
pcl::console::print_highlight (stderr, "Loading "); pcl::console::print_value (stderr, "%s ", cloud_name.c_str ());
if (pcl::io::loadPCDFile (cloud_name, cloud) ==-1)
break;
// Convert from blob to PointCloud
pcl::PointCloud<pcl::PointXYZ>cloud_xyz;
pcl::fromROSMsg (cloud, cloud_xyz);
为了可视化目的,我们通过计算点云的质心,并减去它来是点云以其重心为坐标系的原点,这样所有的视口原点都是所有模型的重心,方便用户直观对比模型之间的相似度。
Eigen::Vector4f centroid;
pcl::compute3DCentroid (cloud_xyz, centroid);
pcl::PointCloud<pcl::PointXYZ>::Ptrcloud_xyz_demean (new pcl::PointCloud<pcl::PointXYZ>);
pcl::demeanPointCloud<pcl::PointXYZ> (cloud_xyz, centroid, *cloud_xyz_demean);
// 添加点云到对应的视口
p.addPointCloud (cloud_xyz_demean, cloud_name, viewport);
最后我们检查通过nearestKSearch获得的距离是否大于用户给定的阈值,如果是的话,在对应的视口显示一条斜的红线段,直观表示其为距离较大的模型,即与用户给定的模型特征文件对应的模型之间相差甚远。
// 创建斜红线段
pcl::PointXYZmin_p, max_p;
pcl::getMinMax3D (*cloud_xyz_demean, min_p, max_p);
std::stringstream line_name;
line_name<<"line_"<<i;
p.addLine (min_p, max_p, 1, 0, 0, line_name.str (), viewport);
p.setShapeRenderingProperties (pcl::visualization::PCL_VISUALIZER_LINE_WIDTH, 5, line_name.str (), viewport);
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件。
注意:如果你在Windows上运行本小节中的代码,必须安装HDF5 1.8.7链接库,CMake如果不能够找到HDF5的,可以手动提供在HDF5_INCLUDE_DIR变量中包括的目录和在HDF5_hdf5_LIBRARY变量中的hdf5dll.lib的全路径,确保所需的动态链接库与可执行文件在同一文件夹下。
生成执行文件后,就可以运行了,data文件夹内包含本书提供的测试数据,在cmd中键入命令:
...>build_tree.exe data/
运行结果如图1所示,循环遍历加载data文件夹下的所有的195个模型VFH特征文件,创建相应的数据和kdtree索引结构,运行完成后在当前目录下产生h5格式的数据文件training_data.h5、所有模型文件的路径保存文件training_data.list、最终创建的具有195个元素的kdtree的索引文件kdtree.idx。
图1 建立树结构运行结果
未完待续,敬请关注“基于VFH描述子的聚类识别与6自由度位姿估计(5)”的其他内容。