I'm using a panoramic image as reference. For each frame of the video I'm extracting Sift feature using SiftGPU and matching them with those of the reference image. Then I'm computing the homography between the 2 images using Ransac homography estimator (OpenCV cvFindHomography).
The performance are low due to complexity of the Sift detection and matching and that I'm applying the homography using cvWarpPerspective.
I'm working on another version using Fast (or Agast) as feature detector and Brief as descriptor. This should lead to a significant speed-up and may eventually run on a mobile… Using the GPU vertex and pixel shader instead of the CPU to apply the homography should also gives a nice speed-up.
In a pre-processing step I've built a sparse point cloud of the place using my SFMToolkit. Each vertex of the point cloud has several 2D Sift features correspondences. I've only kept one Sift descriptor per vertex (mean of the descriptors) and put all descriptors in an index using Flann.
For each frame of the video to be augmented, I've extracted Sift feature with SiftGPU and then matched them using Flann 2-nearest neighbor search and a distance ratio threshold. The Flann matching is done in parallel with boost::threadpool. The matches computed contains a lot of outliers. So I have implemented a Ransac pose estimator using EPnP that permits to filter bad 2d/3d correspondences.
My implementation is slow (due to my implementation of Ransac EPnP that could be improved).
The slowness is not a so big issue because it doesn't need to run at 30fps. Indeed the goal of my prototype is to have absolute pose with this tracking system each second and relative pose using inertial system available on mobile device (or using KLT tracking).
In another post I'll introduce alternative to Bundler: faster and more accurate.