45 #include <boost/bind.hpp>
46 #include <boost/function.hpp>
47 #include <boost/random.hpp>
65 template <
typename Po
intInT,
typename Po
intOutT>
88 typedef boost::function<int (int, double, std::vector<int> &, std::vector<float> &)>
SearchMethod;
98 polynomial_fit_ (true),
100 sqr_gauss_param_ (0.0),
101 compute_normals_ (false),
102 upsample_method_ (
NONE),
103 upsampling_radius_ (0.0),
104 upsampling_step_ (0.0),
105 rng_uniform_distribution_ (),
106 desired_num_points_in_radius_ (0),
109 dilation_iteration_num_ (0),
128 int (
KdTree::*radiusSearch)(
int index,
double radius, std::vector<int> &k_indices, std::vector<float> &k_sqr_distances,
unsigned int max_nn)
const = &
KdTree::radiusSearch;
129 search_method_ = boost::bind (radiusSearch, boost::ref (tree_), _1, _2, _3, _4, 0);
161 setSearchRadius (
double radius) { search_radius_ = radius; sqr_gauss_param_ = search_radius_ * search_radius_; }
231 setPointDensity (
int desired_num_points_in_radius) { desired_num_points_in_radius_ = desired_num_points_in_radius; }
287 bool polynomial_fit_;
290 double search_radius_;
293 double sqr_gauss_param_;
296 bool compute_normals_;
304 double upsampling_radius_;
309 double upsampling_step_;
314 boost::variate_generator<boost::mt19937, boost::uniform_real<float> > *rng_uniform_distribution_;
319 int desired_num_points_in_radius_;
327 MLSResult () : plane_normal (), u (), v (), c_vec (), num_neighbors (), curvature (), valid (false) {}
329 MLSResult (Eigen::Vector3d &a_plane_normal,
330 Eigen::Vector3d &a_u,
331 Eigen::Vector3d &a_v,
332 Eigen::VectorXd a_c_vec,
336 Eigen::Vector3d plane_normal, u, v;
337 Eigen::VectorXd c_vec;
346 std::vector<MLSResult> mls_results_;
365 getIndexIn1D (
const Eigen::Vector3i &index, uint64_t &index_1d)
const
367 index_1d = index[0] * data_size_ * data_size_ +
368 index[1] * data_size_ + index[2];
372 getIndexIn3D (uint64_t index_1d, Eigen::Vector3i& index_3d)
const
374 index_3d[0] =
static_cast<Eigen::Vector3i::Scalar
> (index_1d / (data_size_ * data_size_));
375 index_1d -= index_3d[0] * data_size_ * data_size_;
376 index_3d[1] =
static_cast<Eigen::Vector3i::Scalar
> (index_1d / data_size_);
377 index_1d -= index_3d[1] * data_size_;
378 index_3d[2] =
static_cast<Eigen::Vector3i::Scalar
> (index_1d);
382 getCellIndex (
const Eigen::Vector3f &p, Eigen::Vector3i& index)
const
384 for (
int i = 0; i < 3; ++i)
385 index[i] = static_cast<Eigen::Vector3i::Scalar> ((p[i] - bounding_min_(i)) / voxel_size_);
389 getPosition (
const uint64_t &index_1d, Eigen::Vector3f &point)
const
391 Eigen::Vector3i index_3d;
392 getIndexIn3D (index_1d, index_3d);
393 for (
int i = 0; i < 3; ++i)
394 point[i] = static_cast<Eigen::Vector3f::Scalar> (index_3d[i]) * voxel_size_ + bounding_min_[i];
397 typedef std::map<uint64_t, Leaf> HashMap;
399 Eigen::Vector4f bounding_min_, bounding_max_;
409 int dilation_iteration_num_;
420 searchForNeighbors (
int index, std::vector<int> &indices, std::vector<float> &sqr_distances)
422 return (search_method_ (index, search_radius_, indices, sqr_distances));
436 computeMLSPointNormal (
int index,
438 const std::vector<int> &nn_indices,
439 std::vector<float> &nn_sqr_dists,
458 projectPointToMLSSurface (
float &u_disp,
float &v_disp,
459 Eigen::Vector3d &u, Eigen::Vector3d &v,
460 Eigen::Vector3d &plane_normal,
462 Eigen::Vector3f &query_point,
463 Eigen::VectorXd &c_vec,
465 PointOutT &result_point,
475 std::string getClassName ()
const {
return (
"MovingLeastSquares"); }
478 EIGEN_MAKE_ALIGNED_OPERATOR_NEW