Switch motion tracker bundle adjustment to Ceres.
authorKeir Mierle <mierle@gmail.com>
Mon, 25 Feb 2013 20:00:48 +0000 (20:00 +0000)
committerKeir Mierle <mierle@gmail.com>
Mon, 25 Feb 2013 20:00:48 +0000 (20:00 +0000)
commit2833994a71c548917341a51f9085149f122ddf53
tree93316cfbed05355cfa1b5f7c84e62cbe87f2a2f4
parent5be99abb85d26f5b9ee36b09b8694486dc9e1345
Switch motion tracker bundle adjustment to Ceres.

Patch originally written by me, then finished by Sergey. Big
thanks to Sergey for troopering through and fixing the many issues
with my original (not compilable) patch.

The Ceres implementation uses 2 parameter blocks for each camera
(1 for rotation and 1 for translation), 1 parameter block for
common intrinsics (focal length etc) and 1 parameter block for
each track (e.g. bundle or 3D point).

We turn on some fancy optimizer options to get better performance,
in particular:

  options.preconditioner_type = ceres::SCHUR_JACOBI;
  options.linear_solver_type = ceres::ITERATIVE_SCHUR;
  options.use_inner_iterations = true;
  options.use_nonmonotonic_steps = true;
  options.max_num_iterations = 100;

Special thanks to Sameer Agarwal of Ceres fame for splitting out
the SCHUR_JACOBI preconditioner so that it didn't depend on
CHOLMOD.  Previously we could not use that preconditioner in
Blender because CHOLMOD is too large of a dependency for Blender.

BundleIntrinsicsLogMessage:
- Moved bunch of if(foo) LG << "bar" into this function, to make
  EuclideanBundleCommonIntrinsics a little bit easier to follow.

EuclideanBundle:
- Fix RMSE logging.
extern/libmv/libmv/multiview/euclidean_resection.cc
extern/libmv/libmv/simple_pipeline/bundle.cc