39 #ifndef PCL_INTEGRALIMAGE_BASED_NORMAL_ESTIMATOR_H_ 40 #define PCL_INTEGRALIMAGE_BASED_NORMAL_ESTIMATOR_H_ 42 #include <pcl/point_cloud.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.
This file defines compatibility wrappers for low level I/O functions.
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.
Defines all the PCL implemented PointT point type structures.
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< pcl::PointXYZRGBA > > 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.