49 #include <pcl/pcl_base.h>
51 #include <pcl/search/search.h>
53 #include <pcl/surface/processing.h>
95 MLSResult (
const Eigen::Vector3d &a_query_point,
96 const Eigen::Vector3d &a_mean,
97 const Eigen::Vector3d &a_plane_normal,
98 const Eigen::Vector3d &a_u,
99 const Eigen::Vector3d &a_v,
100 const Eigen::VectorXd &a_c_vec,
101 const int a_num_neighbors,
102 const float a_curvature,
112 getMLSCoordinates (
const Eigen::Vector3d &pt,
double &u,
double &v,
double &w)
const;
135 inline PolynomialPartialDerivative
207 template <
typename Po
intT>
void
211 double search_radius,
212 int polynomial_order = 2,
213 std::function<
double(
const double)> weight_func = {});
234 double computeMLSWeight (
const double sq_dist,
const double sq_mls_radius) {
return (std::exp (-sq_dist / sq_mls_radius)); }
251 template <
typename Po
intInT,
typename Po
intOutT>
255 using Ptr = shared_ptr<MovingLeastSquares<PointInT, PointOutT> >;
256 using ConstPtr = shared_ptr<const MovingLeastSquares<PointInT, PointOutT> >;
303 rng_uniform_distribution_ ()
326 return tree_->radiusSearch (index, radius, k_indices, k_sqr_distances, 0);
479 inline const std::vector<MLSResult>&
574 int dilation_iteration_num);
580 getIndexIn1D (
const Eigen::Vector3i &index, std::uint64_t &index_1d)
const
591 index_3d[1] =
static_cast<Eigen::Vector3i::Scalar
> (index_1d /
data_size_);
593 index_3d[2] =
static_cast<Eigen::Vector3i::Scalar
> (index_1d);
599 for (
int i = 0; i < 3; ++i)
604 getPosition (
const std::uint64_t &index_1d, Eigen::Vector3f &point)
const
606 Eigen::Vector3i index_3d;
608 for (
int i = 0; i < 3; ++i)
612 using HashMap = std::map<std::uint64_t, Leaf>;
675 const Eigen::Vector3d &point,
676 const Eigen::Vector3d &normal,
685 PointOutT &point_out)
const;
701 mutable std::mt19937 rng_;
706 std::unique_ptr<std::uniform_real_distribution<>> rng_uniform_distribution_;
710 getClassName ()
const {
return (
"MovingLeastSquares"); }
714 #ifdef PCL_NO_PRECOMPILE
715 #include <pcl/surface/impl/mls.hpp>
CloudSurfaceProcessing represents the base class for algorithms that takes a point cloud as input and...
A minimalistic implementation of a voxel grid, necessary for the point cloud upsampling.
void getPosition(const std::uint64_t &index_1d, Eigen::Vector3f &point) const
Eigen::Vector4f bounding_min_
void getIndexIn1D(const Eigen::Vector3i &index, std::uint64_t &index_1d) const
Eigen::Vector4f bounding_max_
void getCellIndex(const Eigen::Vector3f &p, Eigen::Vector3i &index) const
void getIndexIn3D(std::uint64_t index_1d, Eigen::Vector3i &index_3d) const
MLSVoxelGrid(PointCloudInConstPtr &cloud, IndicesPtr &indices, float voxel_size, int dilation_iteration_num)
std::map< std::uint64_t, Leaf > HashMap
MovingLeastSquares represent an implementation of the MLS (Moving Least Squares) algorithm for data s...
void setSqrGaussParam(double sqr_gauss_param)
Set the parameter used for distance based weighting of neighbors (the square of the search radius wor...
void setDilationIterations(int iterations)
Set the number of dilation steps of the voxel grid.
bool getCacheMLSResults() const
Get the cache_mls_results_ value (True if the mls results should be stored, otherwise false).
double getSqrGaussParam() const
Get the parameter for distance based weighting of neighbors.
unsigned int threads_
The maximum number of threads the scheduler should use.
void performUpsampling(PointCloudOut &output)
Perform upsampling for the distinct-cloud and voxel-grid methods.
typename PointCloudIn::Ptr PointCloudInPtr
int order_
The order of the polynomial to be fit.
double getSearchRadius() const
Get the sphere radius used for determining the k-nearest neighbors.
typename KdTree::Ptr KdTreePtr
MLSResult::ProjectionMethod projection_method_
Parameter that specifies the projection method to be used.
typename PointCloudOut::Ptr PointCloudOutPtr
KdTreePtr getSearchMethod() const
Get a pointer to the search method used.
void setPolynomialOrder(int order)
Set the order of the polynomial to be fit.
int getPolynomialOrder() const
Get the order of the polynomial to be fit.
double getUpsamplingRadius() const
Get the radius of the circle in the local point plane that will be sampled.
double search_radius_
The nearest neighbors search radius for each point.
MovingLeastSquares()
Empty constructor.
pcl::PointCloud< PointOutT > PointCloudOut
double sqr_gauss_param_
Parameter for distance based weighting of neighbors (search_radius_ * search_radius_ works fine)
typename PointCloudIn::ConstPtr PointCloudInConstPtr
int getPointDensity() const
Get the parameter that specifies the desired number of points within the search radius.
std::function< int(pcl::index_t, double, pcl::Indices &, std::vector< float > &)> SearchMethod
float getDilationVoxelSize() const
Get the voxel size for the voxel grid.
KdTreePtr tree_
A pointer to the spatial search object.
void copyMissingFields(const PointInT &point_in, PointOutT &point_out) const
void setComputeNormals(bool compute_normals)
Set whether the algorithm should also store the normals computed.
void setPointDensity(int desired_num_points_in_radius)
Set the parameter that specifies the desired number of points within the search radius.
MLSResult::ProjectionMethod getProjectionMethod() const
Get the current projection method being used.
shared_ptr< MovingLeastSquares< PointInT, PointOutT > > Ptr
double getUpsamplingStepSize() const
Get the step size for the local plane sampling.
int getDilationIterations() const
Get the number of dilation steps of the voxel grid.
double upsampling_step_
Step size for the local plane sampling.
NormalCloud::Ptr NormalCloudPtr
void setUpsamplingRadius(double radius)
Set the radius of the circle in the local point plane that will be sampled.
NormalCloudPtr normals_
The point cloud that will hold the estimated normals, if set.
void setDistinctCloud(PointCloudInConstPtr distinct_cloud)
Set the distinct cloud used for the DISTINCT_CLOUD upsampling method.
void setDilationVoxelSize(float voxel_size)
Set the voxel size for the voxel grid.
UpsamplingMethod upsample_method_
Parameter that specifies the upsampling method to be used.
int searchForNeighbors(pcl::index_t index, pcl::Indices &indices, std::vector< float > &sqr_distances) const
Search for the nearest neighbors of a given point using a radius search.
double upsampling_radius_
Radius of the circle in the local point plane that will be sampled.
@ RANDOM_UNIFORM_DENSITY
The local plane of each input point will be sampled using an uniform random distribution such that th...
@ SAMPLE_LOCAL_PLANE
The local plane of each input point will be sampled in a circular fashion using the upsampling_radius...
@ VOXEL_GRID_DILATION
The input cloud will be inserted into a voxel grid with voxels of size voxel_size_; this voxel grid w...
@ NONE
No upsampling will be done, only the input points will be projected to their own MLS surfaces.
@ DISTINCT_CLOUD
Project the points of the distinct cloud to the MLS surface.
PointCloudInConstPtr getDistinctCloud() const
Get the distinct cloud used for the DISTINCT_CLOUD upsampling method.
void setSearchMethod(const KdTreePtr &tree)
Provide a pointer to the search object.
int desired_num_points_in_radius_
Parameter that specifies the desired number of points within the search radius.
pcl::PointCloud< pcl::Normal > NormalCloud
const std::vector< MLSResult > & getMLSResults() const
Get the MLSResults for input cloud.
void setUpsamplingMethod(UpsamplingMethod method)
Set the upsampling method to be used.
void setUpsamplingStepSize(double step_size)
Set the step size for the local plane sampling.
PointIndicesPtr corresponding_input_indices_
Collects for each point in output the corresponding point in the input.
void setCacheMLSResults(bool cache_mls_results)
Set whether the mls results should be stored for each point in the input cloud.
int nr_coeff_
Number of coefficients, to be computed from the requested order.
void setNumberOfThreads(unsigned int threads=1)
Set the maximum number of threads to use.
bool compute_normals_
Parameter that specifies whether the normals should be computed for the input cloud or not.
void performProcessing(PointCloudOut &output) override
Abstract surface reconstruction method.
void computeMLSPointNormal(pcl::index_t index, const pcl::Indices &nn_indices, PointCloudOut &projected_points, NormalCloud &projected_points_normals, PointIndices &corresponding_input_indices, MLSResult &mls_result) const
Smooth a given point and its neighborghood using Moving Least Squares.
shared_ptr< const MovingLeastSquares< PointInT, PointOutT > > ConstPtr
SearchMethod search_method_
The search method template for indices.
void process(PointCloudOut &output) override
Base method for surface reconstruction for all points given in <setInputCloud (), setIndices ()>
void addProjectedPointNormal(pcl::index_t index, const Eigen::Vector3d &point, const Eigen::Vector3d &normal, double curvature, PointCloudOut &projected_points, NormalCloud &projected_points_normals, PointIndices &corresponding_input_indices) const
This is a helper function for adding projected points.
PointIndicesPtr getCorrespondingIndices() const
Get the set of indices with each point in output having the corresponding point in input.
void setSearchRadius(double radius)
Set the sphere radius that is to be used for determining the k-nearest neighbors used for fitting.
typename PointCloudOut::ConstPtr PointCloudOutConstPtr
int dilation_iteration_num_
Number of dilation steps for the VOXEL_GRID_DILATION upsampling method.
void setProjectionMethod(MLSResult::ProjectionMethod method)
Set the method to be used when projection the point on to the MLS surface.
bool cache_mls_results_
True if the mls results for the input cloud should be stored.
~MovingLeastSquares() override=default
Empty destructor.
std::vector< MLSResult > mls_results_
Stores the MLS result for each point in the input cloud.
float voxel_size_
Voxel size for the VOXEL_GRID_DILATION upsampling method.
PointCloudInConstPtr distinct_cloud_
The distinct point cloud that will be projected to the MLS surface.
PointIndices::Ptr PointIndicesPtr
PointCloud represents the base class in PCL for storing collections of 3D points.
shared_ptr< PointCloud< pcl::Normal > > Ptr
shared_ptr< const PointCloud< PointOutT > > ConstPtr
shared_ptr< pcl::search::Search< PointInT > > Ptr
#define PCL_MAKE_ALIGNED_OPERATOR_NEW
Macro to signal a class requires a custom allocator.
Defines functions, macros and traits for allocating and using memory.
detail::int_type_t< detail::index_type_size, detail::index_type_signed > index_t
Type used for an index in PCL.
IndicesAllocator<> Indices
Type used for indices in PCL.
PointIndices::Ptr PointIndicesPtr
shared_ptr< Indices > IndicesPtr
Defines all the PCL and non-PCL macros used.
Data structure used to store the MLS projection results.
Eigen::Vector3d point
The projected point.
double v
The v-coordinate of the projected point in local MLS frame.
Eigen::Vector3d normal
The projected point's normal.
double u
The u-coordinate of the projected point in local MLS frame.
MLSProjectionResults()=default
Data structure used to store the MLS polynomial partial derivatives.
double z_uv
The partial derivative d^2z/dudv.
double z_u
The partial derivative dz/du.
double z_uu
The partial derivative d^2z/du^2.
double z
The z component of the polynomial evaluated at z(u, v).
double z_vv
The partial derivative d^2z/dv^2.
double z_v
The partial derivative dz/dv.
Data structure used to store the results of the MLS fitting.
MLSProjectionResults projectPoint(const Eigen::Vector3d &pt, ProjectionMethod method, int required_neighbors=0) const
Project a point using the specified method.
Eigen::Vector3d mean
The mean point of all the neighbors.
MLSProjectionResults projectPointOrthogonalToPolynomialSurface(const double u, const double v, const double w) const
Project a point orthogonal to the polynomial surface.
Eigen::Vector3d u_axis
The axis corresponding to the u-coordinates of the local plane of the query point.
Eigen::Vector3d plane_normal
The normal of the local plane of the query point.
@ ORTHOGONAL
Project to the closest point on the polynonomial surface.
@ SIMPLE
Project along the mls plane normal to the polynomial surface.
@ NONE
Project to the mls plane.
Eigen::Vector3d v_axis
The axis corresponding to the v-coordinates of the local plane of the query point.
int num_neighbors
The number of neighbors used to create the mls surface.
Eigen::VectorXd c_vec
The polynomial coefficients Example: z = c_vec[0] + c_vec[1]*v + c_vec[2]*v^2 + c_vec[3]*u + c_vec[4]...
void computeMLSSurface(const pcl::PointCloud< PointT > &cloud, pcl::index_t index, const pcl::Indices &nn_indices, double search_radius, int polynomial_order=2, std::function< double(const double)> weight_func={})
Smooth a given point and its neighborhood using Moving Least Squares.
void getMLSCoordinates(const Eigen::Vector3d &pt, double &u, double &v, double &w) const
Given a point calculate its 3D location in the MLS frame.
float curvature
The curvature at the query point.
PolynomialPartialDerivative getPolynomialPartialDerivative(const double u, const double v) const
Calculate the polynomial's first and second partial derivatives.
MLSProjectionResults projectPointSimpleToPolynomialSurface(const double u, const double v) const
Project a point along the MLS plane normal to the polynomial surface.
MLSProjectionResults projectPointToMLSPlane(const double u, const double v) const
Project a point onto the MLS plane.
Eigen::Vector2f calculatePrincipalCurvatures(const double u, const double v) const
Calculate the principal curvatures using the polynomial surface.
double getPolynomialValue(const double u, const double v) const
Calculate the polynomial.
Eigen::Vector3d query_point
The query point about which the mls surface was generated.
MLSProjectionResults projectQueryPoint(ProjectionMethod method, int required_neighbors=0) const
Project the query point used to generate the mls surface about using the specified method.
int order
The order of the polynomial.
bool valid
If True, the mls results data is valid, otherwise False.