SLAMflex SE  0.1.0
SLAMflex provides detection and tracking of dominant planes for smartphone devices. This plane can then be used to show AR content relative to the plane orientation. The detection of plane is performed in the field of view of the smartphone camera. In subsequent frames it is tracked. The interface returns the plane position and orientation.
MEstimator.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 // Copyright 2008 Isis Innovation Limited
3 
4 // MEstimator.h
5 //
6 // Defines various MEstimators which can be used by the Tracker and
7 // the Bundle adjuster. Not that some of the inputs are square
8 // quantities!
9 
10 #ifndef __MESTIMATOR_H
11 #define __MESTIMATOR_H
12 #include "TooN.h"
13 using namespace TooN;
14 #include <vector>
15 #include <algorithm>
16 #include <cassert>
17 #include "globals.h"
18 
19 struct Tukey
20 {
21  inline static double FindSigmaSquared(std::vector<double> &vdErrorSquared);
22  inline static double SquareRootWeight(double dErrorSquared, double dSigmaSquared);
23  inline static double Weight(double dErrorSquared, double dSigmaSquared);
24  inline static double ObjectiveScore(double dErrorSquared, double dSigmaSquared);
25 };
26 
27 struct Cauchy
28 {
29  inline static double FindSigmaSquared(std::vector<double> &vdErrorSquared);
30  inline static double SquareRootWeight(double dErrorSquared, double dSigmaSquared);
31  inline static double Weight(double dErrorSquared, double dSigmaSquared);
32  inline static double ObjectiveScore(double dErrorSquared, double dSigmaSquared);
33 };
34 
35 struct Huber
36 {
37  inline static double FindSigmaSquared(std::vector<double> &vdErrorSquared);
38  inline static double SquareRootWeight(double dErrorSquared, double dSigmaSquared);
39  inline static double Weight(double dErrorSquared, double dSigmaSquared);
40  inline static double ObjectiveScore(double dErrorSquared, double dSigmaSquared);
41 };
42 
44 {
45  inline static double FindSigmaSquared(std::vector<double> &vdErrorSquared);
46  inline static double SquareRootWeight(double dErrorSquared, double dSigmaSquared);
47  inline static double Weight(double dErrorSquared, double dSigmaSquared);
48  inline static double ObjectiveScore(double dErrorSquared, double dSigmaSquared);
49 };
50 
51 
52 inline double Tukey::Weight(double dErrorSquared, double dSigmaSquared)
53 {
54  double dSqrt = SquareRootWeight(dErrorSquared, dSigmaSquared);
55  return dSqrt * dSqrt;
56 }
57 
58 inline double Tukey::SquareRootWeight(double dErrorSquared, double dSigmaSquared)
59 {
60  if(dErrorSquared > dSigmaSquared)
61  return 0.0;
62  else
63  return 1.0 - (dErrorSquared / dSigmaSquared);
64 }
65 
66 inline double Tukey::ObjectiveScore(double dErrorSquared, const double dSigmaSquared)
67 {
68  // NB All returned are scaled because
69  // I'm not multiplying by sigmasquared/6.0
70  if(dErrorSquared > dSigmaSquared)
71  return 1.0;
72  double d = 1.0 - dErrorSquared / dSigmaSquared;
73  return (1.0 - d*d*d);
74 }
75 
76 
77 inline double Tukey::FindSigmaSquared(std::vector<double> &vdErrorSquared)
78 {
79  double dSigmaSquared;
80  assert(vdErrorSquared.size() > 0);
81  std::sort(vdErrorSquared.begin(), vdErrorSquared.end());
82  double dMedianSquared = vdErrorSquared[vdErrorSquared.size() / 2];
83  double dSigma = 1.4826 * (1 + 5.0 / (vdErrorSquared.size() * 2 - 6)) * sqrt(dMedianSquared);
84  dSigma = 4.6851 * dSigma;
85  dSigmaSquared = dSigma * dSigma;
86  return dSigmaSquared;
87 }
88 
89 
94 
95 inline double Cauchy::Weight(double dErrorSquared, double dSigmaSquared)
96 {
97  return 1.0 / (1.0 + dErrorSquared / dSigmaSquared);
98 }
99 
100 inline double Cauchy::SquareRootWeight(double dErrorSquared, double dSigmaSquared)
101 {
102  return sqrt(Weight(dErrorSquared, dSigmaSquared));
103 }
104 
105 inline double Cauchy::ObjectiveScore(double dErrorSquared, const double dSigmaSquared)
106 {
107  return log(1.0 + dErrorSquared / dSigmaSquared);
108 }
109 
110 
111 inline double Cauchy::FindSigmaSquared(std::vector<double> &vdErrorSquared)
112 {
113  double dSigmaSquared;
114  assert(vdErrorSquared.size() > 0);
115  std::sort(vdErrorSquared.begin(), vdErrorSquared.end());
116  double dMedianSquared = vdErrorSquared[vdErrorSquared.size() / 2];
117  double dSigma = 1.4826 * (1 + 5.0 / (vdErrorSquared.size() * 2 - 6)) * sqrt(dMedianSquared);
118  dSigma = 4.6851 * dSigma;
119  dSigmaSquared = dSigma * dSigma;
120  return dSigmaSquared;
121 }
122 
123 
128 
129 inline double Huber::Weight(double dErrorSquared, double dSigmaSquared)
130 {
131  if(dErrorSquared < dSigmaSquared)
132  return 1;
133  else
134  return sqrt(dSigmaSquared / dErrorSquared);
135 }
136 
137 inline double Huber::SquareRootWeight(double dErrorSquared, double dSigmaSquared)
138 {
139  return sqrt(Weight(dErrorSquared, dSigmaSquared));
140 }
141 
142 inline double Huber::ObjectiveScore(double dErrorSquared, const double dSigmaSquared)
143 {
144  if(dErrorSquared< dSigmaSquared)
145  return 0.5 * dErrorSquared;
146  else
147  {
148  double dSigma = sqrt(dSigmaSquared);
149  double dError = sqrt(dErrorSquared);
150  return dSigma * ( dError - 0.5 * dSigma);
151  }
152 }
153 
154 
155 inline double Huber::FindSigmaSquared(std::vector<double> &vdErrorSquared)
156 {
157  double dSigmaSquared;
158  assert(vdErrorSquared.size() > 0);
159  std::sort(vdErrorSquared.begin(), vdErrorSquared.end());
160  double dMedianSquared = vdErrorSquared[vdErrorSquared.size() / 2];
161  double dSigma = 1.4826 * (1 + 5.0 / (vdErrorSquared.size() * 2 - 6)) * sqrt(dMedianSquared);
162  dSigma = 1.345 * dSigma;
163  dSigmaSquared = dSigma * dSigma;
164  return dSigmaSquared;
165 }
166 
171 
172 inline double LeastSquares::Weight(double dErrorSquared, double dSigmaSquared)
173 {
174  return 1.0;
175 }
176 
177 inline double LeastSquares::SquareRootWeight(double dErrorSquared, double dSigmaSquared)
178 {
179  return 1.0;
180 }
181 
182 inline double LeastSquares::ObjectiveScore(double dErrorSquared, const double dSigmaSquared)
183 {
184  return dErrorSquared;
185 }
186 
187 
188 inline double LeastSquares::FindSigmaSquared(std::vector<double> &vdErrorSquared)
189 {
190  if(vdErrorSquared.size() == 0)
191  return 0.0;
192  double dSum = 0.0;
193  for(unsigned int i=0; i<vdErrorSquared.size(); i++)
194  dSum+=vdErrorSquared[i];
195  return dSum / vdErrorSquared.size();
196 }
197 
198 #endif
199 
200 
201 
202 
203 
204 
205 
206 
207 
208 
209 
static double Weight(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:129
static double ObjectiveScore(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:142
static double SquareRootWeight(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:58
static double Weight(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:95
Everything lives inside this namespace.
Definition: allocator.hh:48
static double SquareRootWeight(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:177
static double FindSigmaSquared(std::vector< double > &vdErrorSquared)
Definition: MEstimator.h:77
static double FindSigmaSquared(std::vector< double > &vdErrorSquared)
Definition: MEstimator.h:111
static double Weight(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:52
static double ObjectiveScore(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:66
static double Weight(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:172
static double ObjectiveScore(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:182
static double FindSigmaSquared(std::vector< double > &vdErrorSquared)
Definition: MEstimator.h:188
static double SquareRootWeight(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:100
static double FindSigmaSquared(std::vector< double > &vdErrorSquared)
Definition: MEstimator.h:155
static double ObjectiveScore(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:105
static double SquareRootWeight(double dErrorSquared, double dSigmaSquared)
Definition: MEstimator.h:137