25 #ifndef _AbsoluteOrientationRANSAC_hh_
26 #define _AbsoluteOrientationRANSAC_hh_
28 #include <bias_config.h>
29 #include "AbsoluteOrientation.hh"
30 #include <Base/Math/Random.hh>
31 #include <Base/Math/Vector3.hh>
32 #include <Geometry/RMatrix.hh>
60 void SetSignificance(
double significance);
71 { maxError_ = 2.0*sin(0.5*angle); maxError_ *= maxError_; };
80 inline void SetGreedy(
bool greedy) { greedy_ = greedy; };
83 inline void SetRefine(
bool refine) { refine_ = refine; };
87 { useWeightedTargetFunction_ = use; };
91 { solver_.SetRotationAlgorithm(algorithm); };
102 std::vector<bool> &inliers,
103 std::vector<double> &errors,
double &errorSum,
104 const std::vector<double> &w = std::vector<double>(0))
106 const std::vector< Matrix3x3<double> > dummyCov(0);
107 return Compute_(X, Y, dummyCov, dummyCov, dR, dt, ds,
false,
108 inliers, errors, errorSum, w);
122 std::vector<bool> &inliers,
123 std::vector<double> &errors,
double &errorSum)
125 return Compute_(X, Y, CovX, CovY, dR, dt, ds,
false,
126 inliers, errors, errorSum);
138 std::vector<bool> &inliers,
139 std::vector<double> &errors,
double &errorSum,
140 const std::vector<double> &w = std::vector<double>(0))
143 const std::vector< Matrix3x3<double> > dummyCov(0);
144 return Compute_(X, Y, dummyCov, dummyCov, dR, dt, ds,
true,
145 inliers, errors, errorSum, w);
159 std::vector<bool> &inliers,
160 std::vector<double> &errors,
double &errorSum)
163 return Compute_(X, Y, CovX, CovY, dR, dt, ds,
true,
164 inliers, errors, errorSum);
174 RMatrix &dR, std::vector<bool> &inliers,
175 std::vector<double> &errors,
double &errorSum,
176 const std::vector<double> &w = std::vector<double>(0))
178 const std::vector< Matrix3x3<double> > dummyCov(0);
179 return ComputeRotation_(X, Y, dummyCov, dummyCov, dR,
180 inliers, errors, errorSum, w);
192 RMatrix &dR, std::vector<bool> &inliers,
193 std::vector<double> &errors,
double &errorSum,
194 const std::vector<double> &w = std::vector<double>(0))
196 return ComputeRotation_(X, Y, CovX, CovY, dR, inliers, errors, errorSum, w);
206 double GetResidualErrors(std::vector<double> &errors,
210 const double &ds = 1.0,
211 const std::vector<bool> &inliers
212 = std::vector<bool>(0),
213 const std::vector<double> &w
214 = std::vector<double>(0));
223 double GetResidualErrors(std::vector<double> &errors,
229 const double &ds = 1.0,
230 const std::vector<bool> &inliers
231 = std::vector<bool>(0));
240 double GetResidualErrors(std::vector<double> &errors,
244 const std::vector<bool> &inliers
245 = std::vector<bool>(0),
246 const std::vector<double> &w
247 = std::vector<double>(0));
255 double GetResidualErrors(std::vector<double> &errors,
261 const std::vector<bool> &inliers
262 = std::vector<bool>(0));
273 const unsigned int sampleSize_;
274 unsigned int numSamples_;
281 bool useWeightedTargetFunction_;
297 double &ds,
bool enforceScale, std::vector<bool> &inliers,
298 std::vector<double> &errors,
double &errorSum,
299 const std::vector<double> &w = std::vector<double>(0));
311 RMatrix &dR, std::vector<bool> &inliers,
312 std::vector<double> &errors,
double &errorSum,
313 const std::vector<double> &w = std::vector<double>(0));
319 int CreateRandomSample_(
unsigned int samplesize,
324 const std::vector<double> &w,
325 std::vector<int> &samples,
330 std::vector<double> &samplew);
342 int EvaluateInliers_(std::vector<bool> &inliers,
343 std::vector<double> &errors,
double &errorSum,
349 const double &ds,
const std::vector<double> &w);
356 int EvaluateInliers_(std::vector<bool> &inliers,
357 std::vector<double> &errors,
double &errorSum,
362 const RMatrix &dR,
const std::vector<double> &w);
367 #endif // _AbsoluteOrientationRANSAC_hh_
Robust computation of similarity transformation between two 3D point sets using a RANSAC approach...
Computes similarity transformation between 3D point sets.
int Compute(const std::vector< Vector3< double > > &X, const std::vector< Vector3< double > > &Y, RMatrix &dR, Vector3< double > &dt, std::vector< bool > &inliers, std::vector< double > &errors, double &errorSum, const std::vector< double > &w=std::vector< double >(0))
Computes rotation dR and translation dt between coordinate systems from corresponding 3D point sets X...
void SetWeightedTargetFunction(bool use)
Use residual errors instead of inlier count as target function?
int Compute(const std::vector< Vector3< double > > &X, const std::vector< Vector3< double > > &Y, RMatrix &dR, Vector3< double > &dt, double &ds, std::vector< bool > &inliers, std::vector< double > &errors, double &errorSum, const std::vector< double > &w=std::vector< double >(0))
Computes rotation dR, translation dt and isometric scale ds between coordinate systems from correspon...
void SetGreedy(bool greedy)
Use greedy search for good solution?
void SetMaxError(double error)
Set max.
void SetMaxErrorAngle(double angle)
Set max.
int Compute(const std::vector< Vector3< double > > &X, const std::vector< Vector3< double > > &Y, const std::vector< Matrix3x3< double > > &CovX, const std::vector< Matrix3x3< double > > &CovY, RMatrix &dR, Vector3< double > &dt, double &ds, std::vector< bool > &inliers, std::vector< double > &errors, double &errorSum)
Computes rotation dR, translation dt and isometric scale ds between coordinate systems from correspon...
void SetRotationAlgorithm(AbsoluteOrientation::RotationEstimationMethod algorithm)
Set algorithm used for rotation estimation.
void SetMinRatio(double ratio)
Set min.
int ComputeRotation(const std::vector< Vector3< double > > &X, const std::vector< Vector3< double > > &Y, const std::vector< Matrix3x3< double > > &CovX, const std::vector< Matrix3x3< double > > &CovY, RMatrix &dR, std::vector< bool > &inliers, std::vector< double > &errors, double &errorSum, const std::vector< double > &w=std::vector< double >(0))
Computes rotation dR between corresponding 3D ray sets X and Y with covariances CovX, CovY using statistical outlier detection.
int ComputeRotation(const std::vector< Vector3< double > > &X, const std::vector< Vector3< double > > &Y, RMatrix &dR, std::vector< bool > &inliers, std::vector< double > &errors, double &errorSum, const std::vector< double > &w=std::vector< double >(0))
Computes rotation dR between corresponding 3D ray sets X and Y using heuristical outlier detection...
RotationEstimationMethod
Methods for rotation estimation.
class for producing random numbers from different distributions
void SetRefine(bool refine)
Refine final solution with all inliers?
void SetNumSamples(unsigned int n)
Set number of random samples to draw from data.
int Compute(const std::vector< Vector3< double > > &X, const std::vector< Vector3< double > > &Y, const std::vector< Matrix3x3< double > > &CovX, const std::vector< Matrix3x3< double > > &CovY, RMatrix &dR, Vector3< double > &dt, std::vector< bool > &inliers, std::vector< double > &errors, double &errorSum)
Computes rotation dR and translation dt between coordinate systems from corresponding 3D point sets X...