40 #include <pcl/filters/filter.h>
53 template <
typename NormalT>
inline std::vector<float>
56 const std::vector<int>& k_indices,
57 const std::vector<float>& k_sqr_distances)
60 if (k_indices.size () != k_sqr_distances.size ())
61 PCL_ERROR(
"[pcl::assignNormalWeights] inequal size of neighbor indices and distances!\n");
64 return (std::vector<float> (k_indices.size (), 1.0f));
79 template <
typename NormalT>
inline bool
82 const std::vector<int>& k_indices,
83 const std::vector<float>& k_sqr_distances,
87 point.normal_x = 0.0f;
88 point.normal_y = 0.0f;
89 point.normal_z = 0.0f;
92 if (k_indices.size () != k_sqr_distances.size ())
94 PCL_ERROR(
"[pcl::refineNormal] inequal size of neighbor indices and distances!\n");
99 const std::vector<float> weights =
assignNormalWeights (cloud, index, k_indices, k_sqr_distances);
105 for (std::size_t i = 0; i < k_indices.size (); ++i) {
107 const NormalT& pointi = cloud[k_indices[i]];
110 if (std::isfinite (pointi.normal_x) && std::isfinite (pointi.normal_y) && std::isfinite (pointi.normal_z))
112 const float& weighti = weights[i];
113 nx += weighti * pointi.normal_x;
114 ny += weighti * pointi.normal_y;
115 nz += weighti * pointi.normal_z;
120 const float norm = std::sqrt (nx * nx + ny * ny + nz * nz);
121 if (std::isfinite (norm) && norm > std::numeric_limits<float>::epsilon ())
123 point.normal_x = nx / norm;
124 point.normal_y = ny / norm;
125 point.normal_z = nz / norm;
186 template<
typename NormalT>
212 NormalRefinement (
const std::vector< std::vector<int> >& k_indices,
const std::vector< std::vector<float> >& k_sqr_distances) :
226 setCorrespondences (
const std::vector< std::vector<int> >& k_indices,
const std::vector< std::vector<float> >& k_sqr_distances)
228 k_indices_ = k_indices;
229 k_sqr_distances_ = k_sqr_distances;
237 getCorrespondences (std::vector< std::vector<int> >& k_indices, std::vector< std::vector<float> >& k_sqr_distances)
239 k_indices.assign (k_indices_.begin (), k_indices_.end ());
240 k_sqr_distances.assign (k_sqr_distances_.begin (), k_sqr_distances_.end ());
249 max_iterations_ = max_iterations;
258 return max_iterations_;
267 convergence_threshold_ = convergence_threshold;
276 return convergence_threshold_;
288 std::vector< std::vector<int> > k_indices_;
291 std::vector< std::vector<float> > k_sqr_distances_;
294 unsigned int max_iterations_;
297 float convergence_threshold_;
301 #ifdef PCL_NO_PRECOMPILE
302 #include <pcl/filters/impl/normal_refinement.hpp>
304 #define PCL_INSTANTIATE_NormalRefinement(T) template class PCL_EXPORTS pcl::NormalRefinement<T>;