Sorry for the shilling, but here’s my upcoming project:
Please register your email address if you’re interested in it.
This is a C++ / OpenCV port of Niko Sünderhauf’s OpenSeqSLAM, which is in turn, a Matlab implementation of M. Milford and G. Wyeth’s SeqSLAM.
I’m new to SLAM, as in I’ve not yet implemented any SLAM code, nor developed one from the scratch, so bear with my explanation.
Presumably SLAM tries to find where an image is taken, given a set of images and or measurements. It uses local features (e.g. SIFT), as landmarks, and compare it with its own database as part of data association. And in between, most algorithms seem to use Extended Kalman Filter, to estimate the current state.
SeqSLAM on the other hand, has a different approach than common SLAM out there. Rather than relying on features, which might fail when the environment condition changes drastically (e.g. change of weather, etc), it performs matching using ‘whole image approach’ within a sequence of spatially (and temporally) coherent images.
Roughly this is the algorithm of SeqSLAM:
- Down sample the image set to 64 x 32
- For each image, perform preprocessing and image normalisation. Note that they didn’t perform any image rectification, undistortion, or even rely on camera calibration params
- Calculate the difference matrix between the image set
- Perform local contrast enhancement on the difference matrix (by subtracting the mean of local patch, and dividing it with corresponding standard deviation)
- Perform trajectory search within a pre-specified range, in order to find matching images
While I might perform a terrible job in explaining the algorithm, M. Milford uploaded a video explaining the algorithm more clearly here:
Niko Sünderhauf, has a great Matlab implementation, with Nordlandsbanen dataset, which is basically number of image sequence sets captured from a train, in all four seasons. And you can see the result here, where the left image is taken from Spring sequence, and the right one is the matched Winter image :
What’s astonishing about the result, is that it performs relatively well for images that are taken at the similar location, but under very different condition.
You can get my OpenCV / C++ port of Niko Sünderhauf’s Matlab code here: https://github.com/subokita/OpenSeqSLAM
This OpenSeqSLAM page has the original implementation in Matlab, and also the script to download the dataset.