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
8Candidate::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
18void
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
29void
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
76void
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
87float
88Candidate::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
99void
100Candidate::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
109bool
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();
138 m_shape->DistanceAndNormalDeviation(
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
149float
150Candidate::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
186float
187Candidate::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
203void
204Candidate::GetScore(const PointCloud& pc, float bitmapEpsilon, bool doFiltering)
205{
206 GetScoreMaxCCSize(pc, bitmapEpsilon, doFiltering);
207}
208
209void
210Candidate::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
218void
219Candidate::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}
#define float
Definition 16_Level.h:22
float weigh(const float d, const float eps)
constexpr T c
bool IsEquivalent(const Candidate &c, const PointCloud &pc, float epsilon, float normalThresh) const
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
void Reset()
Definition Candidate.cpp:19
void ConnectedComponent(const PointCloud &pc, float bitmapEpsilon, float *borderRatio=0)
float WeightedScore(const PointCloud &pc, float epsilon, float normalThresh) const
Definition Candidate.cpp:88
size_type size() const
Definition Vector.h:215
PrimtiveShape is a shape primitive in conjunction with a parametrization.
virtual float NormalDeviation(const Vec3f &p, const Vec3f &n) const =0
size_t rn_rand()
Definition Random.h:22
std::vector< T > abs(const std::vector< T > &v)