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_SURFEL_SMOOTHING_H_
00039 #define PCL_SURFEL_SMOOTHING_H_
00040 
00041 #include <pcl/pcl_base.h>
00042 #include <pcl/search/pcl_search.h>
00043 
00044 namespace pcl
00045 {
00046   template <typename PointT, typename PointNT>
00047   class SurfelSmoothing : public PCLBase<PointT>
00048   {
00049     using PCLBase<PointT>::input_;
00050     using PCLBase<PointT>::initCompute;
00051 
00052     public:
00053       typedef boost::shared_ptr<SurfelSmoothing<PointT, PointNT> > Ptr;
00054       typedef boost::shared_ptr<const SurfelSmoothing<PointT, PointNT> > ConstPtr;
00055 
00056       typedef pcl::PointCloud<PointT> PointCloudIn;
00057       typedef typename pcl::PointCloud<PointT>::Ptr PointCloudInPtr;
00058       typedef pcl::PointCloud<PointNT> NormalCloud;
00059       typedef typename pcl::PointCloud<PointNT>::Ptr NormalCloudPtr;
00060       typedef pcl::search::Search<PointT> CloudKdTree;
00061       typedef typename pcl::search::Search<PointT>::Ptr CloudKdTreePtr;
00062 
00063       SurfelSmoothing (float a_scale = 0.01)
00064         : PCLBase<PointT> ()
00065         , scale_ (a_scale)
00066         , scale_squared_ (a_scale * a_scale)
00067         , normals_ ()
00068         , interm_cloud_ ()
00069         , interm_normals_ ()
00070         , tree_ ()
00071       {
00072       }
00073 
00074       void
00075       setInputNormals (NormalCloudPtr &a_normals) { normals_ = a_normals; };
00076 
00077       void
00078       setSearchMethod (const CloudKdTreePtr &a_tree) { tree_ = a_tree; };
00079 
00080       bool
00081       initCompute ();
00082 
00083       float
00084       smoothCloudIteration (PointCloudInPtr &output_positions,
00085                             NormalCloudPtr &output_normals);
00086 
00087       void
00088       computeSmoothedCloud (PointCloudInPtr &output_positions,
00089                             NormalCloudPtr &output_normals);
00090 
00091 
00092       void
00093       smoothPoint (size_t &point_index,
00094                    PointT &output_point,
00095                    PointNT &output_normal);
00096 
00097       void
00098       extractSalientFeaturesBetweenScales (PointCloudInPtr &cloud2,
00099                                            NormalCloudPtr &cloud2_normals,
00100                                            boost::shared_ptr<std::vector<int> > &output_features);
00101 
00102     private:
00103       float scale_, scale_squared_;
00104       NormalCloudPtr normals_;
00105 
00106       PointCloudInPtr interm_cloud_;
00107       NormalCloudPtr interm_normals_;
00108 
00109       CloudKdTreePtr tree_;
00110 
00111   };
00112 }
00113 
00114 #ifdef PCL_NO_PRECOMPILE
00115 #include <pcl/surface/impl/surfel_smoothing.hpp>
00116 #endif
00117 
00118 #endif    // PCL_SURFEL_SMOOTHING_H_