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;
72 FitTransform(
const std::vector<Eigen::Vector3d>& x,
const std::vector<Eigen::Vector3d>& p,
double errorThreshold = 0.1 )
73 : x( x ), p( p ), errorThreshold( errorThreshold )
75 assert( x.size() == p.size() );
85 bool fitModel(
const vector_size_t& useIndices, Eigen::Affine3d& model )
const 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++ )
108 double dist = testSample( useIndices[i], m );
109 if( dist > errorThreshold )
121 const Eigen::Vector3d& v1 = x[
index];
122 const Eigen::Vector3d& v2 = model * p[
index];
124 const double dist = (v2-v1).norm();
131 const std::vector<float>&
x_e, p_e;
134 const std::vector<float>& x_e,
const std::vector<float>& p_e,
double errorThreshold = 0.1 )
135 :
FitTransform( x, p, errorThreshold ), x_e( x_e ), p_e( p_e )
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 );
166 vector_size_t a( p_size );
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,
181 vector_size_t& p_inliers,
182 size_t hardIterLimit = 100 )
184 size_t bestScore = 0;
186 size_t softIterLimit = 1;
187 size_t nSamples = p_state.getSampleCount();
188 vector_size_t ind( p_kernelSize );
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 )
204 vector_size_t inliers;
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 getMeanSquareError() const
Definition: ransac.cpp:106
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
Definition: configuration.cpp:3
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
static const unsigned int MIN_PAIRS
Definition: ransac.hpp:21
bool operator<(const pair other) const
Definition: ransac.hpp:54
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