void VFH::loadFeatureModels (const boost::filesystem::path &base_dir, const std::string &extension, std::vector<vfh_model> &models) { if (!boost::filesystem::exists (base_dir) && !boost::filesystem::is_directory (base_dir)) return; for (boost::filesystem::directory_iterator it (base_dir); it != boost::filesystem::directory_iterator (); ++it) { if (boost::filesystem::is_directory (it->status ())) { std::stringstream ss; ss << it->path (); pcl::console::print_highlight ("Loading %s (%lu models loaded so far).\n", ss.str ().c_str (), (unsigned long)models.size ()); loadFeatureModels (it->path (), extension, models); } if(boost::filesystem::is_regular_file (it->status ())) std::cout<<boost::filesystem::extension (it->path ())<<" "<<extension<<std::endl; if(boost::filesystem::extension (it->path ()) == extension) std::cout<<"YES"<<std::endl; if (boost::filesystem::is_regular_file (it->status ()) && boost::filesystem::extension (it->path ()) == extension) { std::cout<<"in"<<std::endl; vfh_model m; if (loadHist (base_dir / it->path ().filename (), m)) models.push_back (m); } } }
int main (int argc, char** argv) { if (argc < 2) { PCL_ERROR ("Need at least two parameters! Syntax is: %s [model_directory] [options]\n", argv[0]); return (-1); } std::string extension (".pcd"); transform (extension.begin (), extension.end (), extension.begin (), (int(*)(int))tolower); 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::ofstream ofs; ofs.open(training_data_h5_file_name.c_str(), std::ofstream::out | std::ofstream::trunc); ofs.close(); std::vector<vfh_model> models; // Load the model histograms loadFeatureModels (argv[1], extension, models); pcl::console::print_highlight ("Loaded %d VFH models. Creating training data %s/%s.\n", (int)models.size (), training_data_h5_file_name.c_str (), training_data_list_file_name.c_str ()); // Convert data into FLANN format flann::Matrix<float> data (new float[models.size () * models[0].second.size ()], models.size (), models[0].second.size ()); for (size_t i = 0; i < data.rows; ++i) for (size_t j = 0; j < data.cols; ++j) data[i][j] = models[i].second[j]; // Save data to disk (list of models) flann::save_to_file (data, training_data_h5_file_name, "training_data"); std::ofstream fs; fs.open (training_data_list_file_name.c_str ()); for (size_t i = 0; i < models.size (); ++i) fs << models[i].first << "\n"; fs.close (); // Build the tree index and save it to disk pcl::console::print_error ("Building the kdtree index (%s) for %d elements...\n", kdtree_idx_file_name.c_str (), (int)data.rows); flann::Index<flann::ChiSquareDistance<float> > index (data, flann::LinearIndexParams ()); // flann::Index<flann::HellingerDistance<float> > index (data, flann::LinearIndexParams ()); //flann::Index<flann::ChiSquareDistance<float> > index (data, flann::KDTreeIndexParams (4)); index.buildIndex (); index.save (kdtree_idx_file_name); delete[] data.ptr (); return (0); }
void VFH::reloadVFH(std::string path_to_dir) { kdtree_idx_file_name = "kdtree.idx"; training_data_h5_file_name = "training_data.h5"; training_data_list_file_name = "training_data.list"; std::vector<vfh_model> models; std::string model_directory (path_to_dir); // Load the model histograms loadFeatureModels (model_directory, ".vfh", models); pcl::console::print_highlight ("Loaded %d VFH models. Creating training data %s/%s.\n", (int)models.size (), training_data_h5_file_name.c_str (), training_data_list_file_name.c_str ()); flann::Matrix<float> data (new float[models.size () * models[0].second.size ()], models.size (), models[0].second.size ()); for (size_t i = 0; i < data.rows; ++i) for (size_t j = 0; j < data.cols; ++j) data[i][j] = models[i].second[j]; std::cout<<"Saving data to disk"<<std::endl; // Save data to disk (list of models) flann::save_to_file (data, training_data_h5_file_name, "training_data"); std::ofstream fs; fs.open (training_data_list_file_name.c_str ()); for (size_t i = 0; i < models.size (); ++i) { std::cout<<models[i].first<<std::endl; fs << models[i].first << "\n"; } fs.close (); // Build the tree index and save it to disk pcl::console::print_error ("Building the kdtree index (%s) for %d elements...\n", kdtree_idx_file_name.c_str (), (int)data.rows); flann::Index<flann::ChiSquareDistance<float> > index (data, flann::LinearIndexParams ()); //flann::Index<flann::ChiSquareDistance<float> > index (data, flann::KDTreeIndexParams (4)); index.buildIndex (); index.save (kdtree_idx_file_name); delete[] data.ptr (); }