Go to the documentation of this file.00001 #include "solution/object_recognition.h"
00002
00003 #include <string>
00004 #include <sstream>
00005 #include <iostream>
00006 #include <pcl/console/parse.h>
00007 #include <pcl/io/pcd_io.h>
00008 #include <pcl/visualization/pcl_visualizer.h>
00009
00010
00011
00012 int
00013 main (int argc, char ** argv)
00014 {
00015 if (argc < 3)
00016 {
00017 pcl::console::print_info ("Syntax is: %s query.pcd <options>\n", argv[0]);
00018 pcl::console::print_info (" where options are:\n");
00019 pcl::console::print_info (" --objects_root_path root_path ......... Root path to append to files in object_files.txt \n");
00020 pcl::console::print_info (" --objects object_files.txt ......... A list of the files to use as exemplars\n");
00021 pcl::console::print_info (" --filter parameters.txt ............ Threshold, downsample, and denoise\n");
00022 pcl::console::print_info (" --segment parameters.txt .......... Remove dominant plane and cluster\n");
00023 pcl::console::print_info (" --feature parameters.txt ........... Compute normals, keypoints, and descriptors\n");
00024 pcl::console::print_info (" --registration parameters.txt ...... Align best fitting model to query\n");
00025 pcl::console::print_info (" and where the parameters files must contain the following values (one per line):\n");
00026 pcl::console::print_info (" filter parameters:\n");
00027 pcl::console::print_info (" * min_depth\n");
00028 pcl::console::print_info (" * max_depth\n");
00029 pcl::console::print_info (" * downsample_leaf_size\n");
00030 pcl::console::print_info (" * outlier_rejection_radius\n");
00031 pcl::console::print_info (" * outlier_rejection_min_neighbors\n");
00032 pcl::console::print_info (" segmentation parameters:\n");
00033 pcl::console::print_info (" * plane_inlier_distance_threshold\n");
00034 pcl::console::print_info (" * max_ransac_iterations\n");
00035 pcl::console::print_info (" * cluster_tolerance\n");
00036 pcl::console::print_info (" * min_cluster_size\n");
00037 pcl::console::print_info (" * max_cluster_size\n");
00038 pcl::console::print_info (" feature estimation parameters:\n");
00039 pcl::console::print_info (" * surface_normal_radius\n");
00040 pcl::console::print_info (" * keypoints_min_scale\n");
00041 pcl::console::print_info (" * keypoints_nr_octaves\n");
00042 pcl::console::print_info (" * keypoints_nr_scales_per_octave\n");
00043 pcl::console::print_info (" * keypoints_min_contrast\n");
00044 pcl::console::print_info (" * local_descriptor_radius\n");
00045 pcl::console::print_info (" registration parameters:\n");
00046 pcl::console::print_info (" * initial_alignment_min_sample_distance\n");
00047 pcl::console::print_info (" * initial_alignment_max_correspondence_distance\n");
00048 pcl::console::print_info (" * initial_alignment_nr_iterations\n");
00049 pcl::console::print_info (" * icp_max_correspondence_distance\n");
00050 pcl::console::print_info (" * icp_rejection_threshold\n");
00051 pcl::console::print_info (" * icp_transformation_epsilon\n");
00052 pcl::console::print_info (" * icp_max_iterations\n");
00053
00054 return (1);
00055 }
00056
00057
00058 PointCloudPtr query (new PointCloud);
00059 pcl::io::loadPCDFile (argv[1], *query);
00060 pcl::console::print_info ("Loaded %s (%zu points)\n", argv[1], query->size ());
00061
00062 ifstream input_stream;
00063 ObjectRecognitionParameters params;
00064
00065
00066 std::string objects_root_path;
00067 pcl::console::parse_argument (argc, argv, "--objects_root_path", objects_root_path);
00068
00069 std::string objects_file;
00070 pcl::console::parse_argument (argc, argv, "--objects", objects_file);
00071 std::vector<std::string> exemplar_filenames (0);
00072 input_stream.open (objects_file.c_str ());
00073 if (input_stream.is_open ())
00074 {
00075 while (input_stream.good ())
00076 {
00077 std::string filename;
00078 input_stream >> filename;
00079 if (filename.size () > 0)
00080 {
00081 exemplar_filenames.push_back (objects_root_path + "/" + filename);
00082 }
00083 }
00084 input_stream.close ();
00085 }
00086
00087
00088 std::string filter_parameters_file;
00089 pcl::console::parse_argument (argc, argv, "--filter", filter_parameters_file) > 0;
00090 input_stream.open (filter_parameters_file.c_str ());
00091 if (input_stream.is_open())
00092 {
00093 input_stream >> params.min_depth;
00094 input_stream >> params.max_depth;
00095 input_stream >> params.downsample_leaf_size;
00096 input_stream >> params.outlier_rejection_radius;
00097 input_stream >> params.outlier_rejection_min_neighbors;
00098 input_stream.close ();
00099 }
00100 else
00101 {
00102 pcl::console::print_info ("Failed to open the filter parameters file (%s)\n", filter_parameters_file.c_str ());
00103 return (1);
00104 }
00105
00106
00107 std::string segmentation_parameters_file;
00108 pcl::console::parse_argument (argc, argv, "--segment", segmentation_parameters_file) > 0;
00109 input_stream.open (segmentation_parameters_file.c_str ());
00110 if (input_stream.is_open())
00111 {
00112 input_stream >> params.plane_inlier_distance_threshold;
00113 input_stream >> params.max_ransac_iterations;
00114 input_stream >> params.cluster_tolerance;
00115 input_stream >> params.min_cluster_size;
00116 input_stream >> params.max_cluster_size;
00117 input_stream.close ();
00118 }
00119 else
00120 {
00121 pcl::console::print_info ("Failed to open the segmentation parameters file (%s)\n",
00122 segmentation_parameters_file.c_str ());
00123 return (1);
00124 }
00125
00126
00127 std::string feature_estimation_parameters_file;
00128 pcl::console::parse_argument (argc, argv, "--feature", feature_estimation_parameters_file) > 0;
00129 input_stream.open (feature_estimation_parameters_file.c_str ());
00130 if (input_stream.is_open())
00131 {
00132 input_stream >> params.surface_normal_radius;
00133 input_stream >> params.keypoints_min_scale;
00134 input_stream >> params.keypoints_nr_octaves;
00135 input_stream >> params.keypoints_nr_scales_per_octave;
00136 input_stream >> params.keypoints_min_contrast;
00137 input_stream >> params.local_descriptor_radius;
00138 input_stream.close ();
00139 }
00140 else
00141 {
00142 pcl::console::print_info ("Failed to open the feature estimation parameters file (%s)\n",
00143 feature_estimation_parameters_file.c_str ());
00144 return (1);
00145 }
00146
00147
00148 std::string registration_parameters_file;
00149 pcl::console::parse_argument (argc, argv, "--registration", registration_parameters_file) > 0;
00150 input_stream.open (registration_parameters_file.c_str ());
00151 if (input_stream.is_open())
00152 {
00153 input_stream >> params.initial_alignment_min_sample_distance;
00154 input_stream >> params.initial_alignment_max_correspondence_distance;
00155 input_stream >> params.initial_alignment_nr_iterations;
00156 input_stream >> params.icp_max_correspondence_distance;
00157 input_stream >> params.icp_outlier_rejection_threshold;
00158 input_stream >> params.icp_transformation_epsilon;
00159 input_stream >> params.icp_max_iterations;
00160 input_stream.close ();
00161 }
00162 else
00163 {
00164 pcl::console::print_info ("Failed to open the registration parameters file (%s)\n",
00165 registration_parameters_file.c_str ());
00166 return (1);
00167 }
00168
00169
00170 ObjectRecognition obj_rec (params);
00171 obj_rec.populateDatabase (exemplar_filenames);
00172
00173
00174 PointCloudPtr aligned_model_points = obj_rec.recognizeAndAlignPoints (query);
00175
00176
00177 pcl::console::print_info ("Starting visualizer... Close window to exit\n");
00178 pcl::visualization::PCLVisualizer vis;
00179
00180 pcl::visualization::PointCloudColorHandlerCustom<PointT> red (aligned_model_points, 255, 0, 0);
00181 vis.addPointCloud (aligned_model_points, red, "model");
00182 vis.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "model");
00183 vis.resetCamera ();
00184
00185 vis.addPointCloud (query, "query");
00186 vis.spin ();
00187
00188 return (0);
00189 }