欢迎点云相关产学研的学者和团体加入我们。
在测试阶段,我们将演示,随机加载一个来自于训练阶段的模型VFH特征文件(用户可以提供自己获取的模型VFH特征文件),从建立的树结构中检索相似的对象,并进行可视化显示。
首先,在PCL(Point Cloud Learning)中国协助发行的书提供光盘的第16章例2文件夹中,打开名为nearest_neighbors.cpp的代码文件,在同文件夹下有data文件夹包含测试点云。
下面解释上面打开的源代码中关键语句,下面行中,
std::vector<int>pcd_indices=pcl::console::parse_file_extension_argument (argc, argv, ".pcd");
vfh_model histogram;
if (!loadHist (argv[pcd_indices.at (0)], histogram))
{
pcl::console::print_error ("Cannot load test file %s\n", argv[pcd_indices.at (0)]);
return (-1);
}
pcl::console::parse_argument (argc, argv, "-thresh", thresh);
// Se arch for the k closestmatches
pcl::console::parse_argument (argc, argv, "-k", k);
pcl::console::print_highlight ("Using "); pcl::console::print_value ("%d", k); pcl::console::print_info (" nearest neighbors.\n");
打开用户给定的直方图模型特征文件,忽略其他,然后继续检查命令行参数,-k指定程序需要检查的显示的近邻数目,-thresh指定检索的模型中允许的最大距离。如果大于最大距离的相似模型,则在显示时都会在其对应的视口上显示红斜线。方便用户直接看出其不在允许的距离范围内。
loadFileList (models, training_data_list_file_name);
flann::load_from_file (data, training_data_h5_file_name, "training_data");
上面代码,从磁盘中加载训练数据,以及前面在建立树结构数据时存储的模型VFH特征文件名列表,然后读取kdtree并重建索引。
flann::Index<flann::ChiSquareDistance<float> > index (data, flann::SavedIndexParams ("kdtree.idx"));
index.buildIndex ();
在这里我们必须确保我们在创建索引对象时使用的是Chi平方距离(此处用的是ChiSquareDistance),与前面创建树结构时使用的索引对象的类型要一致,下面是最重要的一句,
nearestKSearch (index, histogram, k, k_indices, k_distances);
在nearestKSearch函数里面,我们首先将查询点转换成FLANN格式,
flann::Matrix<float> p =flann::Matrix<float>(new float[model.second.size ()], 1, model.second.size ());
memcpy (&p.ptr ()[0], &model.second[0], p.cols*p.rows*sizeof (float));
其次是获得近邻搜索所得到的近邻索引和对应的距离值,
indices=flann::Matrix<int>(new int[k], 1, k);
distances=flann::Matrix<float>(new float[k], 1, k);
index.knnSearch (p, indices, distances, k, flann::SearchParams (512));
index.buildIndex ();
nearestKSearch (index, histogram, k, k_indices, k_distances);
}
// 打印结果到标准输出设备
pcl::console::print_highlight ("The closest %d neighbors for %s are:\n", k, argv[pcd_indices[0]]);
for (int i=0; i< k; ++i)
pcl::console::print_info (" %d - %s (%d) with a distance of: %f\n",
i, models.at (k_indices[0][i]).first.c_str (), k_indices[0][i], k_distances[0][i]);
// 加载最终的结果
pcl::visualization::PCLVisualizer p (argc, argv, "VFH Cluster Classifier");
inty_s= (int)floor (sqrt ((double)k));
intx_s=y_s+ (int)ceil ((k / (double)y_s) -y_s);
doublex_step= (double)(1/ (double)x_s);
未完待续,敬请关注“基于VFH描述子的聚类识别与6自由度位姿估计(4)”的其他内容。