BasePrimitiveShape.h
Go to the documentation of this file.
1#ifndef BASEPRIMITIVESHAPE_HEADER
2#define BASEPRIMITIVESHAPE_HEADER
3#include "PrimitiveShape.h"
4#include "ScoreComputer.h"
5#include <GfxTL/MathHelper.h>
6#include <MiscLib/Random.h>
7
8#ifndef DLL_LINKAGE
9#define DLL_LINKAGE
10#endif
11
13{
14protected:
15 template <class ShapeT>
16 unsigned int
17 ConfidenceTests(unsigned int numTests,
18 float epsilon,
19 float normalThresh,
20 float rms,
21 const PointCloud& pc,
22 const MiscLib::Vector<size_t>& indices) const
23 {
24 unsigned int numFailures = 0;
25 // estimate shapes
26 const unsigned int numSamples = ShapeT::RequiredSamples;
27 if (numSamples >= indices.size())
28 {
29 return numTests;
30 }
32 for (unsigned int i = 0; i < numTests; ++i)
33 {
34 MiscLib::Vector<size_t> sampleIndices;
35 for (unsigned int j = 0; j < numSamples; ++j)
36 {
37 size_t idx;
38 do
39 {
40 idx = indices[MiscLib::rn_rand() % indices.size()];
41 } while (std::find(sampleIndices.begin(), sampleIndices.end(), idx) !=
42 sampleIndices.end());
43 sampleIndices.push_back(idx);
44 }
45 MiscLib::Vector<Vec3f> samples(numSamples << 1);
46 for (unsigned int j = 0; j < numSamples; ++j)
47 {
48 samples[j] = pc[sampleIndices[j]].pos;
49 samples[j + numSamples] = pc[sampleIndices[j]].normal;
50 }
51 ShapeT shape;
52 if (shape.Init(samples))
53 {
54 shapes.push_back(shape);
55 }
56 else
57 {
58 ++numFailures;
59 }
60 }
61
62 MiscLib::Vector<size_t> scores(shapes.size(), 0);
63 //MiscLib::Vector< float > sse(shapes.size(), 0.f);
64 Vec3f n;
65 for (size_t i = 0; i < indices.size(); ++i)
66 {
67 for (size_t j = 0; j < shapes.size(); ++j)
68 {
69 //float d = shapes[j].Distance(pc[indices[i]].pos);
70 //sse[j] += d * d;
71 float d = shapes[j].DistanceAndNormal(pc[indices[i]].pos, &n);
72 if (d > epsilon)
73 {
74 continue;
75 }
76 float dn = n.dot(pc[indices[i]].normal);
77 if (abs(dn) > normalThresh)
78 {
79 ++scores[j];
80 }
81 }
82 }
83
84 for (size_t i = 0; i < /*sse.size()*/ scores.size(); ++i)
85 {
86 if (scores[i] < .9f * indices.size())
87 //if(abs(std::sqrt(sse[i] / indices.size()) - rms) > 1e-2)
88 {
89 ++numFailures;
90 }
91 }
92
93 return numFailures;
94 }
95};
96
97#endif
#define DLL_LINKAGE
Definition basic.h:12
unsigned int ConfidenceTests(unsigned int numTests, float epsilon, float normalThresh, float rms, const PointCloud &pc, const MiscLib::Vector< size_t > &indices) const
size_type size() const
Definition Vector.h:215
void push_back(const T &v)
Definition Vector.h:354
PrimtiveShape is a shape primitive in conjunction with a parametrization.
Definition basic.h:18
size_t rn_rand()
Definition Random.h:22