Candidate.cpp
Go to the documentation of this file.
1 #include "Candidate.h"
2 
4  m_subset(0), m_lowerBound(0), m_upperBound(0), m_level(0), m_hasConnectedComponent(false)
5 {
6 }
7 
8 Candidate::Candidate(PrimitiveShape* shape, size_t level) :
9  m_shape(shape),
10  m_subset(0),
11  m_lowerBound(0),
12  m_upperBound(0),
13  m_level(level),
14  m_hasConnectedComponent(false)
15 {
16 }
17 
18 void
20 {
21  m_indices->clear();
22  m_subset = 0;
23  m_lowerBound = 0;
24  m_upperBound = 0;
25  m_hasConnectedComponent = false;
26  m_score = 0;
27 }
28 
29 void
31  int minInvalidIndex,
32  size_t mergedSubsets,
33  const MiscLib::Vector<size_t>& subsetSizes,
34  const PointCloud& pc,
35  size_t currentSize,
36  float epsilon,
37  float normalThresh,
38  float bitmapEpsilon)
39 {
40  size_t i = 0, j = 0;
41  for (; i < m_indices->size(); ++i)
42  if (newIndices[(*m_indices)[i]] < minInvalidIndex)
43  {
44  (*m_indices)[j++] = newIndices[(*m_indices)[i]];
45  }
46  if (m_subset <= mergedSubsets)
47  {
48  m_hasConnectedComponent = false;
49  m_subset = 0;
50  m_indices->clear();
51  m_lowerBound = 0;
52  m_upperBound = 0; // forget this candidate
53  m_score = 0;
54  return;
55  }
56  else
57  {
58  m_indices->resize(j);
59  m_subset -= mergedSubsets;
60  if (m_subset >= subsetSizes.size())
61  // do connected component if all subsets have been computed
62  {
63  ConnectedComponent(pc, bitmapEpsilon);
64  }
65  }
66  size_t sampledPoints = 0, endi = std::min(m_subset, subsetSizes.size());
67  ;
68  for (i = 0; i < endi; ++i)
69  {
70  sampledPoints += subsetSizes[i];
71  }
72 
73  GetBounds(sampledPoints, currentSize);
74 }
75 
76 void
78 {
79  size_t reindexSize = reindex.size();
80  for (size_t i = 0; i < m_indices->size(); ++i)
81  if (m_indices->at(i) < reindexSize)
82  {
83  m_indices->at(i) = reindex[m_indices->at(i)];
84  }
85 }
86 
87 float
88 Candidate::WeightedScore(const PointCloud& pc, float epsilon, float normalThresh) const
89 {
90  float score = 0;
91 #pragma omp parallel for schedule(static) reduction(+ : score)
92  for (intptr_t i = 0; i < (intptr_t)m_indices->size(); ++i)
93  {
94  score += weigh(m_shape->Distance(pc[(*m_indices)[i]].pos), epsilon);
95  }
96  return score;
97 }
98 
99 void
100 Candidate::ConnectedComponent(const PointCloud& pc, float bitmapEpsilon, float* borderRatio)
101 {
102  size_t oldSize = m_indices->size();
103  size_t connectedSize =
104  m_shape->ConnectedComponent(pc, bitmapEpsilon, m_indices, true, borderRatio);
105  m_indices->resize(connectedSize);
106  m_lowerBound = m_upperBound = (float)m_indices->size();
107 }
108 
109 bool
111  const PointCloud& pc,
112  float epsilon,
113  float normalThresh) const
114 {
115  if (m_shape->Identifier() != c.m_shape->Identifier())
116  {
117  return false;
118  }
119  size_t correct = 0;
120  size_t size = std::min(m_indices->size(), (size_t)9);
121  for (size_t i = 0; i < size; ++i)
122  {
123  std::pair<float, float> dn;
124  size_t idx = MiscLib::rn_rand() % m_indices->size();
125  c.m_shape->DistanceAndNormalDeviation(
126  pc[m_indices->at(idx)].pos, pc[m_indices->at(idx)].normal, &dn);
127  if (dn.first < epsilon && abs(dn.second) > normalThresh)
128  {
129  ++correct;
130  }
131  }
132  size_t tested = size;
133  size = std::min(c.m_indices->size(), (size_t)9);
134  for (size_t i = 0; i < size; ++i)
135  {
136  std::pair<float, float> dn;
137  size_t idx = MiscLib::rn_rand() % c.m_indices->size();
139  pc[c.m_indices->at(idx)].pos, pc[c.m_indices->at(idx)].normal, &dn);
140  if (dn.first < epsilon && abs(dn.second) > normalThresh)
141  {
142  ++correct;
143  }
144  }
145  tested += size;
146  return correct >= 2 * tested / 3;
147 }
148 
149 float
150 Candidate::GetVariance(const PointCloud& pc)
151 {
152  float variance = 0.0f;
153  float dev;
154 
155  if (m_indices->size() > 0)
156  {
157  // first pass - get expectancy
158  float expectancy = 0.0f;
159  for (int i = 0; i < m_indices->size(); ++i)
160  {
161  expectancy +=
162  abs(m_shape->NormalDeviation(pc[(*m_indices)[i]].pos, pc[(*m_indices)[i]].normal));
163  }
164 
165  expectancy /= static_cast<float>(m_indices->size());
166 
167  // second pass - get real variance
168  for (int i = 0; i < m_indices->size(); ++i)
169  {
170  dev =
171  abs(m_shape->NormalDeviation(pc[(*m_indices)[i]].pos, pc[(*m_indices)[i]].normal)) -
172  expectancy;
173  variance += dev * dev;
174  }
175 
176  variance /= static_cast<float>(m_indices->size());
177  }
178  else
179  {
180  variance = 1.0f;
181  }
182 
183  return variance;
184 }
185 
186 float
187 Candidate::GetPseudoVariance(const PointCloud& pc)
188 {
189  float variance = 0.0f;
190  float dev;
191 
192  for (int i = 0; i < m_indices->size(); ++i)
193  {
194  dev = abs(m_shape->NormalDeviation(pc[(*m_indices)[i]].pos, pc[(*m_indices)[i]].normal)) -
195  1.0f;
196  variance += dev * dev;
197  }
198  variance /= static_cast<float>(m_indices->size());
199 
200  return variance;
201 }
202 
203 void
204 Candidate::GetScore(const PointCloud& pc, float bitmapEpsilon, bool doFiltering)
205 {
206  GetScoreMaxCCSize(pc, bitmapEpsilon, doFiltering);
207 }
208 
209 void
210 Candidate::GetScoreMaxCCSize(const PointCloud& pc, float bitmapEpsilon, bool doFiltering)
211 {
212  size_t connectedSize = m_shape->ConnectedComponent(pc, bitmapEpsilon, m_indices, doFiltering);
213  m_indices->resize(connectedSize);
214 
215  m_score = connectedSize;
216 }
217 
218 void
219 Candidate::GetScoreMaxCCMinBorder(const PointCloud& pc, float bitmapEpsilon, bool doFiltering)
220 {
221  float borderRatio;
222  size_t connectedSize =
223  m_shape->ConnectedComponent(pc, bitmapEpsilon, m_indices, doFiltering, &borderRatio);
224  m_indices->resize(connectedSize);
225 
226  m_score = connectedSize * size_t((1.0f - borderRatio) * (1.0f - GetVariance(pc)));
227 }
PrimitiveShape::Identifier
virtual size_t Identifier() const =0
weigh
float weigh(const float d, const float eps)
Definition: ScoreComputer.h:12
MiscLib::Vector::resize
void resize(size_type s, const value_type &v)
Definition: Vector.h:227
PrimitiveShape::ConnectedComponent
virtual size_t ConnectedComponent(const PointCloud &pc, float epsilon, MiscLib::Vector< size_t > *indices, bool doFiltering=true, float *borderRatio=0)=0
Candidate::ConnectedComponent
void ConnectedComponent(const PointCloud &pc, float bitmapEpsilon, float *borderRatio=0)
Definition: Candidate.cpp:100
Candidate::Candidate
Candidate()
Definition: Candidate.cpp:3
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
PrimitiveShape
PrimtiveShape is a shape primitive in conjunction with a parametrization.
Definition: PrimitiveShape.h:34
Point::normal
Vec3f normal
Definition: PointCloud.h:31
PrimitiveShape::NormalDeviation
virtual float NormalDeviation(const Vec3f &p, const Vec3f &n) const =0
PrimitiveShape::Distance
virtual float Distance(const Vec3f &p) const =0
MiscLib::Vector< int >
Candidate
Definition: Candidate.h:19
MiscLib::Vector::size
size_type size() const
Definition: Vector.h:215
PrimitiveShape::DistanceAndNormalDeviation
virtual void DistanceAndNormalDeviation(const Vec3f &p, const Vec3f &n, std::pair< float, float > *dn) const =0
MiscLib::rn_rand
size_t rn_rand()
Definition: Random.h:22
armarx::abs
std::vector< T > abs(const std::vector< T > &v)
Definition: VectorHelpers.h:281
Candidate::IsEquivalent
bool IsEquivalent(const Candidate &c, const PointCloud &pc, float epsilon, float normalThresh) const
Definition: Candidate.cpp:110
Point::pos
Vec3f pos
Definition: PointCloud.h:30
MiscLib::Vector::at
T & at(size_type i)
Definition: Vector.h:314
PointCloud
Definition: PointCloud.h:85
Candidate::WeightedScore
float WeightedScore(const PointCloud &pc, float epsilon, float normalThresh) const
Definition: Candidate.cpp:88
float
#define float
Definition: 16_Level.h:22
Candidate::Reindex
void Reindex(const MiscLib::Vector< int > &newIndices, int minInvalidIndex, size_t mergedSubsets, const MiscLib::Vector< size_t > &subsetSizes, const PointCloud &pc, size_t currentSize, float epsilon, float normalThresh, float bitmapEpsilon)
Definition: Candidate.cpp:30
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
Candidate::Reset
void Reset()
Definition: Candidate.cpp:19
MiscLib::Vector::clear
void clear()
Definition: Vector.h:175