39 #ifndef PCL_SEGMENTATION_PROGRESSIVE_MORPHOLOGICAL_FILTER_HPP_
40 #define PCL_SEGMENTATION_PROGRESSIVE_MORPHOLOGICAL_FILTER_HPP_
42 #include <pcl/common/common.h>
43 #include <pcl/common/io.h>
44 #include <pcl/filters/morphological_filter.h>
45 #include <pcl/filters/extract_indices.h>
46 #include <pcl/segmentation/progressive_morphological_filter.h>
47 #include <pcl/point_cloud.h>
48 #include <pcl/point_types.h>
51 template <
typename Po
intT>
53 max_window_size_ (33),
55 max_distance_ (10.0f),
56 initial_distance_ (0.15f),
64 template <
typename Po
intT>
70 template <
typename Po
intT>
void
73 bool segmentation_is_possible = initCompute ();
74 if (!segmentation_is_possible)
81 std::vector<float> height_thresholds;
82 std::vector<float> window_sizes;
84 float window_size = 0.0f;
85 float height_threshold = 0.0f;
87 while (window_size < max_window_size_)
91 window_size = cell_size_ * (2.0f * std::pow (base_, iteration) + 1.0f);
93 window_size = cell_size_ * (2.0f * (iteration+1) * base_ + 1.0f);
97 height_threshold = initial_distance_;
99 height_threshold = slope_ * (window_size - window_sizes[iteration-1]) * cell_size_ + initial_distance_;
102 if (height_threshold > max_distance_)
103 height_threshold = max_distance_;
105 window_sizes.push_back (window_size);
106 height_thresholds.push_back (height_threshold);
116 for (
size_t i = 0; i < window_sizes.size (); ++i)
118 PCL_DEBUG (
" Iteration %d (height threshold = %f, window size = %f)...",
119 i, height_thresholds[i], window_sizes[i]);
123 pcl::copyPointCloud<PointT> (*input_, ground, *cloud);
128 pcl::applyMorphologicalOperator<PointT> (cloud, window_sizes[i],
MORPH_OPEN, *cloud_f);
132 std::vector<int> pt_indices;
133 for (
size_t p_idx = 0; p_idx < ground.size (); ++p_idx)
135 float diff = cloud->points[p_idx].z - cloud_f->points[p_idx].z;
136 if (diff < height_thresholds[i])
137 pt_indices.push_back (ground[p_idx]);
141 ground.swap (pt_indices);
143 PCL_DEBUG (
"ground now has %d points\n", ground.size ());
149 #define PCL_INSTANTIATE_ProgressiveMorphologicalFilter(T) template class pcl::ProgressiveMorphologicalFilter<T>;
151 #endif // PCL_SEGMENTATION_PROGRESSIVE_MORPHOLOGICAL_FILTER_HPP_
virtual ~ProgressiveMorphologicalFilter()
boost::shared_ptr< PointCloud< PointT > > Ptr
ProgressiveMorphologicalFilter()
Constructor that sets default values for member variables.
PointCloud represents the base class in PCL for storing collections of 3D points. ...
virtual void extract(std::vector< int > &ground)
This method launches the segmentation algorithm and returns indices of points determined to be ground...