The Structure from Motion pipeline in SfM10 is as follows:
- For each camera/view, extract the features using SIFT.
- For each camera pair, compute the matches.
- For each camera pair, compute the good matches by removing outliers and keeping only the inliers. This is done using A Contrario RANSAC aka AC-RANSAC.
- Initialize the 3d scene with an adequate initial pair. The initial pair should be chosen so that the corresponding two views are not related by a homography, in other words, the baseline should be large enough (while having a good number of matches).
- Remove the spurious (low-confidence) 3d points. If the separation angle between the rays emanating from a given 3d point to the camera centers is below some threshold, the 3d point is considered unreliable and is therefore removed from the 3d reconstruction.
- Perform Bundle Adjustment on camera poses and the 3d points. The non-linear cost function is minimized with LBFGS instead of the more widely used Levenberg-Marquardt (just to be different).
- For each remaining camera:
-- Compute the camera pose using EPnP and add measurements to existing 3d points. This is called "resectioning" in Computer Vision lingo.
-- Add the 3d points seen by the camera.
-- Remove the spurious (low confidence) 3d points.
-- Perform Bundle Adjustment.
Everything has been implemented from scratch except the LBFGS solver which comes from Lis: Library of Iterative Solvers for Linear Systems.
Here are some examples of sparse 3d reconstructions obtained by SfM10:
Here's a tutorial video that explains the process:
The windows executable (guaranteed to be virus free) is available for free via the 3D Software Page.