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_INTEGRALIMAGE_BASED_NORMAL_ESTIMATOR_H_
00039 #define PCL_INTEGRALIMAGE_BASED_NORMAL_ESTIMATOR_H_
00040
00041 #include <pcl/point_cloud.h>
00042 #include <pcl/point_types.h>
00043 #include <pcl/features/feature.h>
00044 #include <pcl/features/integral_image2D.h>
00045
00046 #if defined BUILD_Maintainer && defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ > 3
00047 #pragma GCC diagnostic ignored "-Weffc++"
00048 #endif
00049 namespace pcl
00050 {
00054 template <typename PointInT, typename PointOutT>
00055 class IntegralImageNormalEstimation: public Feature<PointInT, PointOutT>
00056 {
00057 using Feature<PointInT, PointOutT>::input_;
00058 using Feature<PointInT, PointOutT>::feature_name_;
00059 using Feature<PointInT, PointOutT>::tree_;
00060 using Feature<PointInT, PointOutT>::k_;
00061
00062 public:
00063
00065 enum BorderPolicy
00066 {
00067 BORDER_POLICY_IGNORE,
00068 BORDER_POLICY_MIRROR
00069 };
00070
00082 enum NormalEstimationMethod
00083 {
00084 COVARIANCE_MATRIX,
00085 AVERAGE_3D_GRADIENT,
00086 AVERAGE_DEPTH_CHANGE,
00087 SIMPLE_3D_GRADIENT
00088 };
00089
00090 typedef typename Feature<PointInT, PointOutT>::PointCloudIn PointCloudIn;
00091 typedef typename Feature<PointInT, PointOutT>::PointCloudOut PointCloudOut;
00092
00094 IntegralImageNormalEstimation ()
00095 : normal_estimation_method_(AVERAGE_3D_GRADIENT)
00096 , border_policy_ (BORDER_POLICY_IGNORE)
00097 , rect_width_ (0), rect_width_2_ (0), rect_width_4_ (0)
00098 , rect_height_ (0), rect_height_2_ (0), rect_height_4_ (0)
00099 , distance_threshold_ (0)
00100 , integral_image_DX_ (false)
00101 , integral_image_DY_ (false)
00102 , integral_image_depth_ (false)
00103 , integral_image_XYZ_ (true)
00104 , diff_x_ (NULL)
00105 , diff_y_ (NULL)
00106 , depth_data_ (NULL)
00107 , distance_map_ (NULL)
00108 , use_depth_dependent_smoothing_ (false)
00109 , max_depth_change_factor_ (20.0f*0.001f)
00110 , normal_smoothing_size_ (10.0f)
00111 , init_covariance_matrix_ (false)
00112 , init_average_3d_gradient_ (false)
00113 , init_simple_3d_gradient_ (false)
00114 , init_depth_change_ (false)
00115 , vpx_ (0.0f)
00116 , vpy_ (0.0f)
00117 , vpz_ (0.0f)
00118 , use_sensor_origin_ (true)
00119 {
00120 feature_name_ = "IntegralImagesNormalEstimation";
00121 tree_.reset ();
00122 k_ = 1;
00123 }
00124
00126 virtual ~IntegralImageNormalEstimation ();
00127
00132 void
00133 setRectSize (const int width, const int height);
00134
00138 void
00139 setBorderPolicy (const BorderPolicy border_policy)
00140 {
00141 border_policy_ = border_policy;
00142 }
00143
00150 void
00151 computePointNormal (const int pos_x, const int pos_y, const unsigned point_index, PointOutT &normal);
00152
00159 void
00160 computePointNormalMirror (const int pos_x, const int pos_y, const unsigned point_index, PointOutT &normal);
00161
00166 void
00167 setMaxDepthChangeFactor (float max_depth_change_factor)
00168 {
00169 max_depth_change_factor_ = max_depth_change_factor;
00170 }
00171
00176 void
00177 setNormalSmoothingSize (float normal_smoothing_size)
00178 {
00179 normal_smoothing_size_ = normal_smoothing_size;
00180 }
00181
00194 void
00195 setNormalEstimationMethod (NormalEstimationMethod normal_estimation_method)
00196 {
00197 normal_estimation_method_ = normal_estimation_method;
00198 }
00199
00203 void
00204 setDepthDependentSmoothing (bool use_depth_dependent_smoothing)
00205 {
00206 use_depth_dependent_smoothing_ = use_depth_dependent_smoothing;
00207 }
00208
00212 virtual inline void
00213 setInputCloud (const typename PointCloudIn::ConstPtr &cloud)
00214 {
00215 input_ = cloud;
00216 if (!cloud->isOrganized ())
00217 {
00218 PCL_ERROR ("[pcl::IntegralImageNormalEstimation::setInputCloud] Input dataset is not organized (height = 1).\n");
00219 return;
00220 }
00221
00222 init_covariance_matrix_ = init_average_3d_gradient_ = init_depth_change_ = false;
00223
00224 if (use_sensor_origin_)
00225 {
00226 vpx_ = input_->sensor_origin_.coeff (0);
00227 vpy_ = input_->sensor_origin_.coeff (1);
00228 vpz_ = input_->sensor_origin_.coeff (2);
00229 }
00230
00231
00232 initData ();
00233 }
00234
00237 inline float*
00238 getDistanceMap ()
00239 {
00240 return (distance_map_);
00241 }
00242
00248 inline void
00249 setViewPoint (float vpx, float vpy, float vpz)
00250 {
00251 vpx_ = vpx;
00252 vpy_ = vpy;
00253 vpz_ = vpz;
00254 use_sensor_origin_ = false;
00255 }
00256
00265 inline void
00266 getViewPoint (float &vpx, float &vpy, float &vpz)
00267 {
00268 vpx = vpx_;
00269 vpy = vpy_;
00270 vpz = vpz_;
00271 }
00272
00277 inline void
00278 useSensorOriginAsViewPoint ()
00279 {
00280 use_sensor_origin_ = true;
00281 if (input_)
00282 {
00283 vpx_ = input_->sensor_origin_.coeff (0);
00284 vpy_ = input_->sensor_origin_.coeff (1);
00285 vpz_ = input_->sensor_origin_.coeff (2);
00286 }
00287 else
00288 {
00289 vpx_ = 0;
00290 vpy_ = 0;
00291 vpz_ = 0;
00292 }
00293 }
00294
00295 protected:
00296
00300 void
00301 computeFeature (PointCloudOut &output);
00302
00304 void
00305 initData ();
00306
00307 private:
00314 NormalEstimationMethod normal_estimation_method_;
00315
00317 BorderPolicy border_policy_;
00318
00320 int rect_width_;
00321 int rect_width_2_;
00322 int rect_width_4_;
00324 int rect_height_;
00325 int rect_height_2_;
00326 int rect_height_4_;
00327
00329 float distance_threshold_;
00330
00332 IntegralImage2D<float, 3> integral_image_DX_;
00334 IntegralImage2D<float, 3> integral_image_DY_;
00336 IntegralImage2D<float, 1> integral_image_depth_;
00338 IntegralImage2D<float, 3> integral_image_XYZ_;
00339
00341 float *diff_x_;
00343 float *diff_y_;
00344
00346 float *depth_data_;
00347
00349 float *distance_map_;
00350
00352 bool use_depth_dependent_smoothing_;
00353
00355 float max_depth_change_factor_;
00356
00358 float normal_smoothing_size_;
00359
00361 bool init_covariance_matrix_;
00362
00364 bool init_average_3d_gradient_;
00365
00367 bool init_simple_3d_gradient_;
00368
00370 bool init_depth_change_;
00371
00374 float vpx_, vpy_, vpz_;
00375
00377 bool use_sensor_origin_;
00378
00380 bool
00381 initCompute ();
00382
00384 void
00385 initCovarianceMatrixMethod ();
00386
00388 void
00389 initAverage3DGradientMethod ();
00390
00392 void
00393 initAverageDepthChangeMethod ();
00394
00396 void
00397 initSimple3DGradientMethod ();
00398
00399 private:
00403 void
00404 computeFeatureEigen (pcl::PointCloud<Eigen::MatrixXf> &) {}
00405 public:
00406 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00407 };
00408 }
00409 #if defined BUILD_Maintainer && defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ > 3
00410 #pragma GCC diagnostic warning "-Weffc++"
00411 #endif
00412
00413
00414 #endif
00415