I’ve compiled a new version of Bundler with 2 interesting new options:
--parallel_epipolar
--ba sba
BTW those options should be passed as command arguments to bundler.exe directly (and not been added to the options.txt file).
The parallel_epipolar option allows to estimate the fundamental matrices (ransac + lm) in parallel. This problem is embarrassingly parallel but due to some global variables used in the callback passed to lmfit it wasn’t that easy to implement: I’ve used a functor to hide the global variables used by the callback but sadly lmfit doesn’t have a void* userData parameter (only a pointer to the callback). Thus I’ve modified lmfit and add this missing parameter that allow me to pass a pointer to my functor. Furthermore I had to compile almost everything in C++ instead of C to use my functor inside lmfit. Thus I had to fix a lot of malloc calls that weren’t compiling in C++ due to missing cast. To keep a “backward behavior compatibility” this option is disabled by default.
The ba option allows to change the bundle adjustment “engine” used. Here is the list of available “engine”:
- sba (default)
- none (for debug only)
- pba_cpu_double
- pba_cpu_float
- pba_gpu_float
Pba stand for Parallel Bundle Adjustment: I’ve integrated mcba from Changchang Wu.
So if you have an Nvidia GPU card and installed the Cuda runtime you can add those options:
bundler.exe list_focal_absolute.txt --ba pba_gpu_float --parallel_epipolar
--options_file options.txt //on the same line
Timing on a 245 pictures dataset:
Bundler BA |
Time |
Nb pictures registered |
SBA |
2h18min |
233 |
PBA CPU double |
23min |
230 |
PBA CPU float |
9min |
230 |
PBA GPU float |
6min |
230 |
none (for debug) |
2min |
189 (bad reconstruction) |
You can download this new version of bundler: bundler-multiBA-parallelEpipolar-x64.zip
Update: the source code is available on the MCBA branch of my Bundler fork.