Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef PCL_REGISTRATION_VISUALIZER_H_
00039 #define PCL_REGISTRATION_VISUALIZER_H_
00040
00041
00042 #include <pcl/registration/registration.h>
00043 #include <pcl/visualization/pcl_visualizer.h>
00044
00045 namespace pcl
00046 {
00054 template<typename PointSource, typename PointTarget>
00055 class RegistrationVisualizer
00056 {
00057
00058 public:
00060 RegistrationVisualizer () :
00061 viewer_ (),
00062 viewer_thread_ (),
00063 registration_method_name_ (),
00064 update_visualizer_ (),
00065 first_update_flag_ (),
00066 cloud_source_ (),
00067 cloud_target_ (),
00068 visualizer_updating_mutex_ (),
00069 cloud_intermediate_ (),
00070 cloud_intermediate_indices_ (),
00071 cloud_target_indices_ (),
00072 maximum_displayed_correspondences_ (0)
00073 {}
00074
00082 bool
00083 setRegistration (pcl::Registration<PointSource, PointTarget> ®istration)
00084 {
00085
00086 registration_method_name_ = registration.getClassName();
00087
00088
00089
00090 update_visualizer_ = boost::bind (&RegistrationVisualizer<PointSource, PointTarget>::updateIntermediateCloud,
00091 this, _1, _2, _3, _4);
00092
00093
00094 registration.registerVisualizationCallback (this->update_visualizer_);
00095
00096
00097
00098 visualizer_updating_mutex_.lock ();
00099
00100 first_update_flag_ = false;
00101
00102 visualizer_updating_mutex_.unlock ();
00103
00104 return true;
00105 }
00106
00109 void
00110 startDisplay ();
00111
00114 void
00115 stopDisplay ();
00116
00124 void
00125 updateIntermediateCloud (const pcl::PointCloud<PointSource> &cloud_src, const std::vector<int> &indices_src,
00126 const pcl::PointCloud<PointTarget> &cloud_tgt, const std::vector<int> &indices_tgt);
00127
00129 inline void
00130 setMaximumDisplayedCorrespondences (const int maximum_displayed_correspondences)
00131 {
00132
00133
00134
00135
00136 visualizer_updating_mutex_.lock ();
00137
00138
00139 maximum_displayed_correspondences_ = maximum_displayed_correspondences;
00140
00141
00142 visualizer_updating_mutex_.unlock();
00143 }
00144
00146 inline size_t
00147 getMaximumDisplayedCorrespondences()
00148 {
00149 return maximum_displayed_correspondences_;
00150 }
00151
00152 private:
00154 void
00155 runDisplay ();
00156
00158 inline std::string
00159 getIndexedName (std::string &root_name, size_t &id)
00160 {
00161 std::stringstream id_stream_;
00162 id_stream_ << id;
00163 std::string indexed_name_ = root_name + id_stream_.str ();
00164 return indexed_name_;
00165 }
00166
00168 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer_;
00169
00171 boost::thread viewer_thread_;
00172
00174 std::string registration_method_name_;
00175
00177 boost::function<void
00178 (const pcl::PointCloud<PointSource> &cloud_src, const std::vector<int> &indices_src, const pcl::PointCloud<
00179 PointTarget> &cloud_tgt, const std::vector<int> &indices_tgt)> update_visualizer_;
00180
00182 bool first_update_flag_;
00183
00185 pcl::PointCloud<PointSource> cloud_source_;
00186
00188 pcl::PointCloud<PointTarget> cloud_target_;
00189
00191 boost::mutex visualizer_updating_mutex_;
00192
00194 pcl::PointCloud<PointSource> cloud_intermediate_;
00195
00197 std::vector<int> cloud_intermediate_indices_;
00198
00200 std::vector<int> cloud_target_indices_;
00201
00203 size_t maximum_displayed_correspondences_;
00204
00205 };
00206 }
00207
00208 #include <pcl/visualization/impl/registration_visualizer.hpp>
00209
00210 #endif //#ifndef PCL_REGISTRATION_VISUALIZER_H_