geometry.h
Go to the documentation of this file.
1 // Copyright 2017 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 #ifndef _OPENGR_UTILS_GEOMETRY_H_
48 #define _OPENGR_UTILS_GEOMETRY_H_
49 
50 #include "gr/utils/disablewarnings.h"
51 #include "Eigen/Core"
52 
53 namespace gr{
54 namespace Utils{
55 
56 
57 template <typename PointContainer, typename VecContainer>
58 static inline void CleanInvalidNormals( PointContainer &v,
59  VecContainer &normals){
60  using Point = typename PointContainer::value_type;
61  using Vector = typename VecContainer::value_type;
62  if (v.size() == normals.size()){
63  typename PointContainer::iterator itV = v.begin();
64  typename VecContainer::iterator itN = normals.begin();
65 
66  unsigned int nb = 0;
67  for( ; itV != v.end(); itV++, itN++){
68 
69  if ((*itV).normal().squaredNorm() < 0.01){
70  (*itN) = {0., 0., 0.};
71  (*itV).set_normal({0., 0., 0.});
72  nb++;
73  }else{
74  (*itN).normalize();
75  (*itV).normalize();
76  }
77  }
78 
79  if (nb != 0){
80  std::cout << "Found " << nb << " vertices with invalid normals" << std::endl;
81  }
82  }
83 }
84 
85 template <typename PointContainer>
86 static inline void TransformPointCloud( PointContainer& v,
87  Eigen::Ref<const Eigen::Matrix<typename PointContainer::value_type::Scalar, 4, 4>> tr){
88  using Scalar = typename PointContainer::value_type::Scalar;
89  auto tr3x3 = tr.template block<3,3>(0,0);
90  for (auto& vertex : v){
91  vertex.pos() = (tr * vertex.pos().homogeneous()).template head<3>();
92  vertex.set_normal(tr3x3 * vertex.normal());
93  }
94 }
95 
96 } // namespace Utils
97 } // namespace gr
98 
99 #endif // _UTILS_GEOMETRY_H_
static void CleanInvalidNormals(PointContainer &v, VecContainer &normals)
Definition: geometry.h:58
static void TransformPointCloud(PointContainer &v, Eigen::Ref< const Eigen::Matrix< typename PointContainer::value_type::Scalar, 4, 4 >> tr)
Definition: geometry.h:86