38 #ifndef PCL_GRAPH_EDGE_WEIGHT_COMPUTER_H
39 #define PCL_GRAPH_EDGE_WEIGHT_COMPUTER_H
41 #include <boost/function.hpp>
194 template <
typename GraphT>
238 policy_(SMALL_WEIGHT_IGNORE),
254 template <
typename EdgeWeightMap>
255 void compute(GraphT& graph, EdgeWeightMap weights);
269 compute(graph, boost::get(boost::edge_weight, graph));
283 template <
typename TermT>
286 float convex_influence_multiplier = 1.0,
291 convex_influence_multiplier,
293 typename boost::mpl::apply<typename TermT::is_compatible, PointT>::type());
300 template <
typename TermT>
308 typename boost::mpl::apply<typename TermT::is_compatible, PointT>::type());
322 threshold_ = threshold;
329 balancing_function_ = func;
335 gaussian(
float val,
float influence)
337 return (influence > 0.0 ? std::exp(-val / influence) : 1.0);
347 ComputeFunction compute_;
349 float convex_influence_multiplier_;
351 Term(ComputeFunction f,
float i,
float c) :
352 compute_(f), influence_(i), convex_influence_multiplier_(
c)
357 getInfluence(
bool is_convex =
false)
const
359 return (influence_ * (is_convex ? convex_influence_multiplier_ : 1.0));
366 struct GloballyNormalizedTerm : Term
369 GloballyNormalizedTerm(
typename Term::ComputeFunction f,
float i,
float c) :
375 init(
size_t num_edges)
377 edge_weights_.resize(num_edges, 0.0f);
378 total_weight_ = 0.0f;
382 round1(
const PointT& p1,
const PointT& p2,
size_t edge_id)
384 float weight = this->compute_(p1, p2);
385 edge_weights_[edge_id] = weight;
386 total_weight_ += weight;
393 average_ = total_weight_ / edge_weights_.size();
397 round2(
size_t edge_id)
399 return (edge_weights_[edge_id] / average_);
402 std::vector<float> edge_weights_;
410 struct LocallyNormalizedTerm : Term
413 LocallyNormalizedTerm(
typename Term::ComputeFunction f,
float i,
float c) :
419 init(
size_t num_edges,
size_t num_vertices)
421 edge_weights_.resize(num_edges, 0.0f);
422 vertex_sums_.resize(num_vertices, 0.0f);
423 vertex_degrees_.resize(num_vertices, 0);
433 float weight = this->compute_(p1, p2);
434 edge_weights_[edge_id] = weight;
435 vertex_sums_[vertex1_id] += weight;
436 vertex_sums_[vertex2_id] += weight;
437 ++vertex_degrees_[vertex1_id];
438 ++vertex_degrees_[vertex2_id];
445 for (
size_t i = 0; i < vertex_sums_.size(); ++i)
446 if (vertex_degrees_[i])
448 vertex_sums_[i] /= vertex_degrees_[i];
453 round2(
size_t vertex1_id,
size_t vertex2_id,
size_t edge_id)
const
455 float n = (vertex_sums_[vertex1_id] + vertex_sums_[vertex2_id]) / 2.0;
457 (n > 0.0f && this->getInfluence() > 0.0f) ? edge_weights_[edge_id] / n : 0.0f;
461 std::vector<float> edge_weights_;
462 std::vector<float> vertex_sums_;
463 std::vector<size_t> vertex_degrees_;
466 template <
typename TermT>
468 addTermImpl(
float influence,
469 float convex_influence_multiplier,
470 NormalizationType normalization,
471 boost::mpl::bool_<true>)
473 switch (normalization)
475 case NORMALIZATION_NONE:
477 terms_.push_back(Term(
478 TermT::template compute<PointT>, influence, convex_influence_multiplier));
481 case NORMALIZATION_GLOBAL:
483 g_terms_.push_back(GloballyNormalizedTerm(
484 TermT::template compute<PointT>, influence, convex_influence_multiplier));
487 case NORMALIZATION_LOCAL:
489 l_terms_.push_back(LocallyNormalizedTerm(
490 TermT::template compute<PointT>, influence, convex_influence_multiplier));
498 template <
typename TermT>
500 addTermImpl(
float influence,
501 float convex_influence_multiplier,
502 NormalizationType normalization,
503 boost::mpl::bool_<false>)
507 std::vector<Term> terms_;
508 std::vector<GloballyNormalizedTerm> g_terms_;
509 std::vector<LocallyNormalizedTerm> l_terms_;
511 SmallWeightPolicy policy_;
513 TermBalancingFunction balancing_function_;