RANSAC C++ examples
1. RANSAC algorithm
Random sample consensus (RANSAC) was originally presented in the seminal work [FB81] and is still widely used nowadays (e.g. in the front-end of Visual SLAM or Visual Odometry systems). For a theoretical description of the algorithm, refer to [FB81] or to this Wikipedia article and the cites herein.
MRPT comprises a generic, template-based C++ implementation of this robust model fit algorithm, useful for outliers rejection. See also this excellent MATLAB toolkit by Peter Kovesi, on which MRPT implementation is strongly based.
2. C++ API
The base C++ API for RANSAC in MRPT is mrpt::math::RANSAC_Template, while some specialized classes exist for particular instances of common problems, e.g. fit a plane or a line to a point cloud, as shown below.
A simple genetic-like modification of RANSAC is also available through the template class mrpt::math::ModelSearch.
3. Particular applications
3.1. Fit a plane from 3D points
Refer to the example source code for a direct usage of the generic C++ RANSAC template to see how to define custom models and test functions.
3.2. Fit many planes from 3D points
MRPT provides the following functions for detecting planes (see their C++ API documentation or the complete example):
template <typename NUMTYPE>
void mrpt::math::ransac_detect_3D_planes(
const CVectorDynamic<NUMTYPE>& x,
const CVectorDynamic<NUMTYPE>& y,
const CVectorDynamic<NUMTYPE>& z,
std::vector<std::pair<size_t, TPlane>>& out_detected_planes,
const double threshold,
const size_t min_inliers_for_valid_plane = 10
)
template <class POINTSMAP>
void mrpt::math::ransac_detect_3D_planes(
const POINTSMAP* points_map,
std::vector<std::pair<size_t, TPlane>>& out_detected_planes,
const double threshold,
const size_t min_inliers_for_valid_plane
)
3.3. Fit 2D lines
MRPT provides the following function to detect lines (see their C++ API documentation or the complete example):
template <typename NUMTYPE>
void mrpt::math::ransac_detect_2D_lines(
const CVectorDynamic<NUMTYPE>& x,
const CVectorDynamic<NUMTYPE>& y,
std::vector<std::pair<size_t, TLine2D>>& out_detected_lines,
const double threshold,
const size_t min_inliers_for_valid_line = 5
)
3.4. Data association with RANSAC
This example illustrates how RANSAC can be used to establish the pairings (the “data association” problem) between a set of 2D noisy observations and another set of 2D predictions from a map. For example it could be used to match planar range-bearing landmarks against a 2D map, or a subset of image keypoints against a larger image mosaic.
This method was discussed in our paper [BGonzalezJimenezFernandezM13].