bruteForceFunctor.h
Go to the documentation of this file.
1 // Copyright 2014 Nicolas Mellado
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // -------------------------------------------------------------------------- //
16 //
17 // Authors: Nicolas Mellado
18 //
19 // An implementation of the Super 4-points Congruent Sets (Super 4PCS)
20 // algorithm presented in:
21 //
22 // Super 4PCS: Fast Global Pointcloud Registration via Smart Indexing
23 // Nicolas Mellado, Dror Aiger, Niloy J. Mitra
24 // Symposium on Geometry Processing 2014.
25 //
26 // Data acquisition in large-scale scenes regularly involves accumulating
27 // information across multiple scans. A common approach is to locally align scan
28 // pairs using Iterative Closest Point (ICP) algorithm (or its variants), but
29 // requires static scenes and small motion between scan pairs. This prevents
30 // accumulating data across multiple scan sessions and/or different acquisition
31 // modalities (e.g., stereo, depth scans). Alternatively, one can use a global
32 // registration algorithm allowing scans to be in arbitrary initial poses. The
33 // state-of-the-art global registration algorithm, 4PCS, however has a quadratic
34 // time complexity in the number of data points. This vastly limits its
35 // applicability to acquisition of large environments. We present Super 4PCS for
36 // global pointcloud registration that is optimal, i.e., runs in linear time (in
37 // the number of data points) and is also output sensitive in the complexity of
38 // the alignment problem based on the (unknown) overlap across scan pairs.
39 // Technically, we map the algorithm as an ‘instance problem’ and solve it
40 // efficiently using a smart indexing data organization. The algorithm is
41 // simple, memory-efficient, and fast. We demonstrate that Super 4PCS results in
42 // significant speedup over alternative approaches and allows unstructured
43 // efficient acquisition of scenes at scales previously not possible. Complete
44 // source code and datasets are available for research use at
45 // http://geometry.cs.ucl.ac.uk/projects/2014/super4PCS/.
46 
47 
48 #ifndef _OPENGR_ACCELERATORS_BRUTE_FORCE_FUNCTOR_H_
49 #define _OPENGR_ACCELERATORS_BRUTE_FORCE_FUNCTOR_H_
50 
51 #include "gr/accelerators/pairExtraction/intersectionNode.h"
52 #include <list>
53 #include <iostream>
54 
55 namespace gr{
56 
57 struct DummyPrimitive {};
58 
59 //! \brief Extract pairs of points using brute force approach
60 /*!
61  * Brute force approach used in 4PCS
62  * \see
63  * \todo Use Traits to allow custom parameters but similar API between variants
64  */
65 template <class _DummyPrimitive, class _Point, int _dim, typename _Scalar>
67  typedef _Point Point;
68  typedef _Scalar Scalar;
69  enum { dim = _dim };
70 
71  template <class PrimitiveContainer,
72  class PointContainer,
73  class ProcessingFunctor> //!< Process the extracted pairs
74  inline
75  void
76  process(
77  const PrimitiveContainer & M, //!< Input point set \in [0:1]^d
78  const PointContainer & Q, //!< Input point set \in [0:1]^d
79  Scalar &epsilon, //!< Intersection accuracy, refined
80  unsigned int minNodeSize, //!< Min number of points in nodes
81  ProcessingFunctor& functor
82  );
83 
84 };
85 
86 
87 /*!
88  \return Pairs< PointId, PrimitiveId>
89  */
90 template <class DummyPrimitive, class Point, int dim, typename Scalar>
91 template <class PrimitiveContainer,
92  class PointContainer,
93  class ProcessingFunctor>
94 void
95 BruteForceFunctor<DummyPrimitive, Point, dim, Scalar>::process(
96  const PrimitiveContainer & M, //!< Input point set \in [0:1]^d
97  const PointContainer & Q, //!< Input point set \in [0:1]^d
98  Scalar &epsilon, //!< Intersection accuracy, refined
99  unsigned int /*minNodeSize*/, //!< Min number of points in nodes
100  ProcessingFunctor& functor
101  )
102 {
103 
104  const unsigned int sizeM = M.size();
105  const unsigned int sizeQ = Q.size();
106  for (unsigned int j = 0; j != sizeQ; ++j){
107  functor.beginPrimitiveCollect(j);
108  for (unsigned int i = 0; i != sizeM; ++i){
109  if( M[i].intersectPoint(Q[j], epsilon ))
110  functor.process(i,j);
111  }
112  functor.endPrimitiveCollect(j);
113  }
114 }
115 
116 } // namespace gr
117 
118 #endif // _BRUTE_FORCE_FUNCTOR_H_
_Scalar Scalar
Definition: bruteForceFunctor.h:68
Definition: bruteForceFunctor.h:57
Definition: bruteForceFunctor.h:69
CongruentSetExplorationBase< Traits, PointType, TransformVisitor, PairFilteringFunctor, OptExts... >::Scalar ComputeTransformation(const InputRange1 &P, const InputRange2 &Q, Eigen::Ref< typename CongruentSetExplorationBase< Traits, PointType, TransformVisitor, PairFilteringFunctor, OptExts... >::MatrixType > transformation, const Sampler< PointType > &sampler, TransformVisitor &v)
Definition: congruentSetExplorationBase.hpp:61
_Point Point
Definition: bruteForceFunctor.h:67
void process(const PrimitiveContainer &M, const PointContainer &Q, Scalar &epsilon, unsigned int minNodeSize, ProcessingFunctor &functor)
< Process the extracted pairs
Definition: bruteForceFunctor.h:95
Extract pairs of points using brute force approach.
Definition: bruteForceFunctor.h:66