RansacShapeDetector.h
Go to the documentation of this file.
1 #ifndef RANSACSHAPEDETECTOR_HEADER
2 #define RANSACSHAPEDETECTOR_HEADER
3 #include <chrono>
4 #include <utility>
5 
6 #include "Candidate.h"
7 #include "Octree.h"
8 #include "PointCloud.h"
11 #include <GfxTL/NullClass.h>
12 #include <MiscLib/NoShrinkVector.h>
13 #include <MiscLib/RefCountPtr.h>
14 #include <MiscLib/Vector.h>
15 
16 #ifndef DLL_LINKAGE
17 #define DLL_LINKAGE
18 #endif
19 
21 {
22 public:
23  struct Options
24  {
25  static constexpr auto invalidRuntime =
27 
28  Options() :
29  m_epsilon(0.01f),
30  m_normalThresh(0.95f),
31  m_minSupport(100),
32  m_bitmapEpsilon(0.01f),
33  m_fitting(LS_FITTING),
34  m_probability(0.001f),
35  m_maxruntime(invalidRuntime)
36  {
37  }
38 
39  float m_epsilon;
41  unsigned int m_minSupport;
43 
44  enum
45  {
47  LS_FITTING
48  } m_fitting;
49 
51  std::chrono::milliseconds m_maxruntime;
52  };
53 
55  RansacShapeDetector(const Options& options);
56  virtual ~RansacShapeDetector();
58  size_t Detect(PointCloud& pc,
59  size_t begin,
60  size_t end,
62 
63  void
64  AutoAcceptSize(size_t s)
65  {
66  m_autoAcceptSize = s;
67  }
68 
69  size_t
71  {
72  return m_autoAcceptSize;
73  }
74 
75  const Options&
76  GetOptions() const
77  {
78  return m_options;
79  }
80 
81 private:
82  typedef MiscLib::Vector<PrimitiveShapeConstructor*> ConstructorsType;
83  typedef MiscLib::NoShrinkVector<Candidate> CandidatesType;
84  bool DrawSamplesStratified(const IndexedOctreeType& oct,
85  size_t numSamples,
86  size_t depth,
87  const MiscLib::Vector<int>& shapeIndex,
88  MiscLib::Vector<size_t>* samples,
89  const IndexedOctreeType::CellType** node) const;
90  PrimitiveShape* Fit(bool allowDifferentShapes,
91  const PrimitiveShape& initialShape,
92  const PointCloud& pc,
95  std::pair<size_t, float>* score) const;
96 
97  float
98  CandidateFailureProbability(float candidateSize,
99  float numberOfPoints,
100  float drawnCandidates,
101  float levels) const
102  {
103  return std::min(
104  std::pow(1.f - candidateSize / (numberOfPoints * levels * (1 << (m_reqSamples - 1))),
105  drawnCandidates),
106  1.f);
107  }
108 
109  float
110  UpdateAcceptedFailureProbability(float currentFailureProbability, size_t numTries) const
111  {
112  //currentFailureProbability *= 1.1f;//1.61;/*powf(1.05, 1<<numTries);*/ //1.1f;
113  if (currentFailureProbability > 1.f)
114  {
115  currentFailureProbability = 1.f;
116  }
117  return currentFailureProbability;
118  }
119  template <class ScoreVisitorT>
120  void GenerateCandidates(const IndexedOctreeType& globalOctTree,
122  const PointCloud& pc,
123  ScoreVisitorT& scoreVisitor,
124  size_t currentSize,
125  size_t numInvalid,
126  const MiscLib::Vector<double>& sampleLevelProbSum,
127  size_t* drawnCandidates,
128  MiscLib::Vector<std::pair<float, size_t>>* sampleLevelScores,
129  float* bestExpectedValue,
130  CandidatesType* candidates) const;
131  template <class ScoreVisitorT>
132  bool FindBestCandidate(CandidatesType& candidates,
134  const PointCloud& pc,
135  ScoreVisitorT& scoreVisitor,
136  size_t currentSize,
137  size_t drawnCandidates,
138  size_t numInvalid,
139  size_t minSize,
140  float numLevels,
141  float* maxForgottenCandidate,
142  float* candidateFailProb) const;
143  size_t StatBucket(float score) const;
144  void UpdateLevelWeights(float factor,
145  const MiscLib::Vector<std::pair<float, size_t>>& levelScores,
146  MiscLib::Vector<double>* sampleLevelProbability) const;
147 
148 private:
149  ConstructorsType m_constructors;
150  Options m_options;
151  size_t m_maxCandTries;
152  size_t m_reqSamples;
153  size_t m_autoAcceptSize;
154 };
155 
156 #endif
PrimitiveShapeConstructor.h
Vector.h
RansacShapeDetector::GetOptions
const Options & GetOptions() const
Definition: RansacShapeDetector.h:76
PrimitiveShape
PrimtiveShape is a shape primitive in conjunction with a parametrization.
Definition: PrimitiveShape.h:34
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
RansacShapeDetector::Options::m_bitmapEpsilon
float m_bitmapEpsilon
Definition: RansacShapeDetector.h:42
RansacShapeDetector::AutoAcceptSize
void AutoAcceptSize(size_t s)
Definition: RansacShapeDetector.h:64
m_normalThresh
ransacOptions m_normalThresh
Definition: ReadMe.txt:79
MiscLib::Vector
Definition: Vector.h:19
PrimitiveShapeConstructor
Definition: PrimitiveShapeConstructor.h:24
RansacShapeDetector::Options::m_normalThresh
float m_normalThresh
Definition: RansacShapeDetector.h:40
MiscLib::NoShrinkVector
Definition: NoShrinkVector.h:17
NoShrinkVector.h
RefCountPtr.h
RansacShapeDetector
Definition: RansacShapeDetector.h:20
m_minSupport
ransacOptions m_minSupport
Definition: ReadMe.txt:80
ImmediateTreeDataKernels.h
RansacShapeDetector::Options
Definition: RansacShapeDetector.h:23
RansacShapeDetector::Options::NO_FITTING
@ NO_FITTING
Definition: RansacShapeDetector.h:46
max
T max(T t1, T t2)
Definition: gdiam.h:51
MiscLib::RefCountPtr< PrimitiveShape >
RansacShapeDetector::Options::m_probability
float m_probability
Definition: RansacShapeDetector.h:50
PointCloud
Definition: PointCloud.h:85
RansacShapeDetector::Options::m_minSupport
unsigned int m_minSupport
Definition: RansacShapeDetector.h:41
m_probability
ransacOptoins m_probability
Definition: ReadMe.txt:81
GfxTL::AACubeTreeCell
Definition: AACubeTree.h:15
m_bitmapEpsilon
ransacOptions m_bitmapEpsilon
Definition: ReadMe.txt:77
RansacShapeDetector::Options::m_maxruntime
std::chrono::milliseconds m_maxruntime
Definition: RansacShapeDetector.h:51
RansacShapeDetector::Options::m_epsilon
float m_epsilon
Definition: RansacShapeDetector.h:39
NullClass.h
RansacShapeDetector::AutoAcceptSize
size_t AutoAcceptSize() const
Definition: RansacShapeDetector.h:70
PointCloud.h
DLL_LINKAGE
#define DLL_LINKAGE
Definition: basic.h:12
Octree.h
pc
Introduction Thank you for taking interest in our work and downloading this software This library implements the algorithm described in the paper R R R Klein Efficient RANSAC for Point Cloud Shape in Computer Graphics Blackwell June If you use this software you should cite the aforementioned paper in any resulting publication Please send comments or bug reports to Ruwen Roland BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY OR CONSEQUENTIAL WHETHER IN STRICT OR EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE Example usage This section shows how to use the library to detect the shapes in a point cloud PointCloud pc
Definition: ReadMe.txt:68
min
T min(T t1, T t2)
Definition: gdiam.h:44
Candidate.h
RansacShapeDetector::Options::Options
Options()
Definition: RansacShapeDetector.h:28
shapes
MiscLib::Vector< std::pair< MiscLib::RefCountPtr< PrimitiveShape >, size_t > > shapes
Definition: ReadMe.txt:92
m_epsilon
ransacOptions m_epsilon
Definition: ReadMe.txt:75
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
Add
detector Add(new PlanePrimitiveShapeConstructor())
GfxTL::AACubeTree
Definition: AACubeTree.h:338