39 #ifndef PCL_INTEGRALIMAGE_BASED_NORMAL_ESTIMATOR_H_ 40 #define PCL_INTEGRALIMAGE_BASED_NORMAL_ESTIMATOR_H_ 42 #include <pcl/point_cloud.h> 43 #include <pcl/point_types.h> 44 #include <pcl/features/feature.h> 45 #include <pcl/features/integral_image2D.h> 47 #if defined BUILD_Maintainer && defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ > 3 48 #pragma GCC diagnostic ignored "-Weffc++" 67 template <
typename Po
intInT,
typename Po
intOutT>
77 typedef boost::shared_ptr<IntegralImageNormalEstimation<PointInT, PointOutT> >
Ptr;
78 typedef boost::shared_ptr<const IntegralImageNormalEstimation<PointInT, PointOutT> >
ConstPtr;
113 , rect_width_ (0), rect_width_2_ (0), rect_width_4_ (0)
114 , rect_height_ (0), rect_height_2_ (0), rect_height_4_ (0)
115 , distance_threshold_ (0)
116 , integral_image_DX_ (false)
117 , integral_image_DY_ (false)
118 , integral_image_depth_ (false)
119 , integral_image_XYZ_ (true)
123 , distance_map_ (NULL)
124 , use_depth_dependent_smoothing_ (false)
125 , max_depth_change_factor_ (20.0f*0.001f)
126 , normal_smoothing_size_ (10.0f)
127 , init_covariance_matrix_ (false)
128 , init_average_3d_gradient_ (false)
129 , init_simple_3d_gradient_ (false)
130 , init_depth_change_ (false)
134 , use_sensor_origin_ (true)
157 border_policy_ = border_policy;
167 computePointNormal (
const int pos_x,
const int pos_y,
const unsigned point_index, PointOutT &normal);
185 max_depth_change_factor_ = max_depth_change_factor;
195 if (normal_smoothing_size <= 0)
197 PCL_ERROR (
"[pcl::%s::setNormalSmoothingSize] Invalid normal smoothing size given! (%f). Allowed ranges are: 0 < N. Defaulting to %f.\n",
198 feature_name_.c_str (), normal_smoothing_size, normal_smoothing_size_);
201 normal_smoothing_size_ = normal_smoothing_size;
219 normal_estimation_method_ = normal_estimation_method;
228 use_depth_dependent_smoothing_ = use_depth_dependent_smoothing;
238 if (!cloud->isOrganized ())
240 PCL_ERROR (
"[pcl::IntegralImageNormalEstimation::setInputCloud] Input dataset is not organized (height = 1).\n");
244 init_covariance_matrix_ = init_average_3d_gradient_ = init_depth_change_ =
false;
246 if (use_sensor_origin_)
248 vpx_ =
input_->sensor_origin_.coeff (0);
249 vpy_ =
input_->sensor_origin_.coeff (1);
250 vpz_ =
input_->sensor_origin_.coeff (2);
262 return (distance_map_);
276 use_sensor_origin_ =
false;
302 use_sensor_origin_ =
true;
305 vpx_ =
input_->sensor_origin_.coeff (0);
306 vpy_ =
input_->sensor_origin_.coeff (1);
307 vpz_ =
input_->sensor_origin_.coeff (2);
331 computeFeatureFull (
const float* distance_map,
const float& bad_point, PointCloudOut& output);
339 computeFeaturePart (
const float* distance_map,
const float& bad_point, PointCloudOut& output);
358 flipNormalTowardsViewpoint (
const PointInT &point,
359 float vp_x,
float vp_y,
float vp_z,
360 float &nx,
float &ny,
float &nz)
368 float cos_theta = (vp_x * nx + vp_y * ny + vp_z * nz);
400 float distance_threshold_;
420 float *distance_map_;
423 bool use_depth_dependent_smoothing_;
426 float max_depth_change_factor_;
429 float normal_smoothing_size_;
432 bool init_covariance_matrix_;
435 bool init_average_3d_gradient_;
438 bool init_simple_3d_gradient_;
441 bool init_depth_change_;
445 float vpx_, vpy_, vpz_;
448 bool use_sensor_origin_;
456 initCovarianceMatrixMethod ();
460 initAverage3DGradientMethod ();
464 initAverageDepthChangeMethod ();
468 initSimple3DGradientMethod ();
471 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
474 #if defined BUILD_Maintainer && defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ > 3 475 #pragma GCC diagnostic warning "-Weffc++" 478 #ifdef PCL_NO_PRECOMPILE 479 #include <pcl/features/impl/integral_image_normal.hpp> virtual ~IntegralImageNormalEstimation()
Destructor.
void computePointNormalMirror(const int pos_x, const int pos_y, const unsigned point_index, PointOutT &normal)
Computes the normal at the specified position with mirroring for border handling. ...
std::string feature_name_
The feature name.
int k_
The number of K nearest neighbors to use for each point.
void computePointNormal(const int pos_x, const int pos_y, const unsigned point_index, PointOutT &normal)
Computes the normal at the specified position.
Feature< PointInT, PointOutT >::PointCloudOut PointCloudOut
IntegralImageNormalEstimation()
Constructor.
KdTreePtr tree_
A pointer to the spatial search object.
void setBorderPolicy(const BorderPolicy border_policy)
Sets the policy for handling borders.
void getViewPoint(float &vpx, float &vpy, float &vpz)
Get the viewpoint.
void setRectSize(const int width, const int height)
Set the regions size which is considered for normal estimation.
void computeFeature(PointCloudOut &output)
Computes the normal for the complete cloud or only indices_ if provided.
void initData()
Initialize the data structures, based on the normal estimation method chosen.
Surface normal estimation on organized data using integral images.
void setMaxDepthChangeFactor(float max_depth_change_factor)
The depth change threshold for computing object borders.
void useSensorOriginAsViewPoint()
sets whether the sensor origin or a user given viewpoint should be used.
boost::shared_ptr< const PointCloud< PointInT > > ConstPtr
void computeFeatureFull(const float *distance_map, const float &bad_point, PointCloudOut &output)
Computes the normal for the complete cloud.
void setNormalEstimationMethod(NormalEstimationMethod normal_estimation_method)
Set the normal estimation method.
BorderPolicy
Different types of border handling.
virtual void setInputCloud(const typename PointCloudIn::ConstPtr &cloud)
Provide a pointer to the input dataset (overwrites the PCLBase::setInputCloud method) ...
boost::shared_ptr< const IntegralImageNormalEstimation< PointInT, PointOutT > > ConstPtr
void setViewPoint(float vpx, float vpy, float vpz)
Set the viewpoint.
float * getDistanceMap()
Returns a pointer to the distance map which was computed internally.
void computeFeaturePart(const float *distance_map, const float &bad_point, PointCloudOut &output)
Computes the normal for part of the cloud specified by indices_.
Feature< PointInT, PointOutT >::PointCloudIn PointCloudIn
PointCloudConstPtr input_
The input point cloud dataset.
Feature represents the base feature class.
boost::shared_ptr< IntegralImageNormalEstimation< PointInT, PointOutT > > Ptr
NormalEstimationMethod
Different normal estimation methods.
void setNormalSmoothingSize(float normal_smoothing_size)
Set the normal smoothing size.
void setDepthDependentSmoothing(bool use_depth_dependent_smoothing)
Set whether to use depth depending smoothing or not.