对PCL中build_tree.cpp的的学习与解释
从主函数main开始阅读
首先是命令行参数,执行
“$ ./build/build_tree data/”
前一字符串为项目运行的所在位置,后一个字符串是pcd文件的位置
如果改在VS2017中运行,可以直接注释掉93到97行代码,并将109行的loadFeatureModels中的第一个参数直接设定为文件位置
loadFeatureModels("data/", extension, models);
第99和100行代码,添加了文件名后缀
使用std::transform大概是为了将可能存在的大写字母转换为小写字母,防止出错,但是感觉没有必要
std::string extension(".pcd");
transform(extension.begin(), extension.end(), extension.begin(), (int(*)(int))tolower);
也可以直接改写为
std::string extension = ".pcd";
经过验证也没有错误
102至106代码添加了一些名称和变量
std::string kdtree_idx_file_name = "kdtree.idx";
std::string training_data_h5_file_name = "training_data.h5";
std::string training_data_list_file_name = "training_data.list";
std::vector<vfh_model> models;
前三个分别是用于用于存储的kdtree序列文件名称,训练数据的h5文件名称和训练数据列表文件名称
第四个需要说明一下,是新定义的一个结构 vfh_model 在第11行
typedef std::pair<std::string, std::vector<float> > vfh_model;
该类型是以一个二元数来存储加载一个vfh模型
第一个数据类型为std::stringpath 是输入文件的路径
第二个参数类型为std::vector 是VFH模型的各直方图数据,每一个元素都代表了一个直方块
然后是函数 loadFeatureModels
void
loadFeatureModels(const boost::filesystem::path &base_dir, const std::string &extension,
std::vector<vfh_model> &models)
第一个参数base_dir 是需要搜索的文件夹路径(不包括文件名)
第二个参数extension 是需要搜索的的文件后缀名
第三个参数models 是用存放加载得到的VFH模型
简单来说,该方法递归遍历给定文件夹路径下的所有目录和子目录,加载所有找到的PCD文件数据至模型,该方法调用loadHist,将尝试打开找到的每个PCD文件,读取其标题,并检查其是否包含VFH签名。将PCD文件名连同VFH签名存储到vfh_model数组中。
在代码中做一个简单的注释
/** \brief Load a set of VFH features that will act as the model (training data)
* \param argc the number of arguments (pass from main ())
* \param argv the actual command line arguments (pass from main ())
* \param extension the file extension containing the VFH features
* \param models the resultant vector of histogram models
*/
loadFeatureModels(const boost