1 #ifndef __STEREO_RANSAC_HPP__
2 #define __STEREO_RANSAC_HPP__
8 #include <Eigen/Eigenvalues>
25 void add(
const Eigen::Vector3d& a,
const Eigen::Vector3d& b,
double dist );
30 double trim(
size_t n_po );
47 std::vector<Eigen::Vector3d>
x,
p;
69 const std::vector<Eigen::Vector3d>&
x,
p;
75 assert( x.size() == p.size() );
87 if( useIndices.size() < 3 )
89 std::cout << useIndices.size() << std::endl;
94 for(
size_t i = 0; i < useIndices.size(); i++ )
96 const size_t index = useIndices[i];
97 const Eigen::Vector3d& v1 =
x[index];
98 const Eigen::Vector3d& v2 =
p[index];
99 pairs.
add( v1, v2, (v2-v1).norm() );
106 for(
size_t i = 0; i < useIndices.size(); i++ )
119 virtual double testSample(
size_t index,
const Eigen::Affine3d& model )
const
121 const Eigen::Vector3d& v1 =
x[index];
122 const Eigen::Vector3d& v2 = model *
p[index];
124 const double dist = (v2-v1).norm();
141 virtual double testSample(
size_t index,
const Eigen::Affine3d& model )
const
143 const Eigen::Vector3d& v1 =
x[index];
144 const Eigen::Vector3d& v2 = model *
p[index];
146 const float e1 =
x_e[index];
147 const float e2 =
p_e[index];
150 const double dist = (v2-v1).norm() / sqrt(pow(e1,2) + pow(e2,2));
161 template <
typename T>
164 assert( p_size >= p_pick );
167 for(
size_t i = 0; i < p_size; i++ )
170 std::random_shuffle( a.begin(), a.end() );
171 p_ind.resize( p_pick );
172 for(
size_t i = 0 ; i < p_pick; i++ )
176 template<
typename TModelFit>
179 const typename TModelFit::Real& p_fitnessThreshold,
180 typename TModelFit::Model& p_bestModel,
182 size_t hardIterLimit = 100 )
184 size_t bestScore = 0;
186 size_t softIterLimit = 1;
187 size_t nSamples = p_state.getSampleCount();
190 while ( iter < softIterLimit && iter < hardIterLimit )
192 bool degenerate =
true;
193 typename TModelFit::Model currentModel;
198 degenerate = !p_state.fitModel( ind, currentModel );
200 if( i > hardIterLimit )
206 for(
size_t i = 0; i < nSamples; i++ )
208 if( p_state.testSample( i, currentModel ) < p_fitnessThreshold )
209 inliers.push_back( i );
211 assert( inliers.size() > 0 );
214 const size_t ninliers = inliers.size();
216 if ( ninliers > bestScore )
218 bestScore = ninliers;
219 p_bestModel = currentModel;
223 float f = ninliers /
static_cast<float>( nSamples );
224 float p = 1 - pow( f, static_cast<float>( p_kernelSize ) );
225 float eps = std::numeric_limits<float>::epsilon();
226 p = std::max( eps, p);
227 p = std::min( 1-eps, p);
228 softIterLimit = log(1-p) / log(p);
void pickRandomIndex(T p_size, T p_pick, vector_size_t &p_ind)
Definition: ransac.hpp:162
std::vector< pair > pairs
Definition: ransac.hpp:59
double mse
Definition: ransac.hpp:61
void add(const Eigen::Vector3d &a, const Eigen::Vector3d &b, double dist)
Definition: ransac.cpp:9
Definition: ransac.hpp:49
double distance
Definition: ransac.hpp:52
double getMeanSquareError() const
Definition: ransac.cpp:106
size_t size() const
Definition: ransac.cpp:101
std::vector< Eigen::Vector3d > p
Definition: ransac.hpp:47
Definition: ransac.hpp:18
void clear()
Definition: ransac.cpp:111
std::vector< Eigen::Vector3d > x
Definition: ransac.hpp:47
double trim(size_t n_po)
Definition: ransac.cpp:20
Eigen::Affine3d getTransform()
Definition: ransac.cpp:40
size_t index
Definition: ransac.hpp:51
bool operator<(const pair other) const
Definition: ransac.hpp:54
static const unsigned int MIN_PAIRS
Definition: ransac.hpp:21
std::vector< size_t > vector_size_t
Definition: ransac.hpp:15
bool ransacSingleModel(const TModelFit &p_state, size_t p_kernelSize, const typename TModelFit::Real &p_fitnessThreshold, typename TModelFit::Model &p_bestModel, vector_size_t &p_inliers, size_t hardIterLimit=100)
Definition: ransac.hpp:177