This time I bring some material about local feature point detection, description and matching. I was wondering which method should I use for egomotion estimation in on-board applications, so I decided to make a (simple) comparison between some methods I have at hand.
The methods I’ve tested are:
- SIFT (OpenCV 2.x C++ implementation, included in the nonfree module): The other day I read a demonstration that stated that SIFT is the best generic method, and that any other approach will only outperform it in terms of speed or particularly at some specific function. Nevertheless, you might know that SIFT is patented, so if you plan to use it in your commercial applications, prepare yourself to pay (visit Lowe’s website for more details http://www.cs.ubc.ca/~lowe/).
- FAST (OpenCV 2.x C++ implementation): I’ve selected this one due to its ability to provide a lot of features in short time. This is probably the faster method for local feature detection. Combined with BRIEF, it can give pretty nice results. Some modifications of it can be found in the author’s website http://www.edwardrosten.com/work/fast.html .
- ORB (OpenCV 2.x C++ implementation): As an alternative to FAST, ORB (Oriented BRIEF) appears as a natural extension, which provides invariance to rotation (FAST-BRIEF does not). It’s a little bit slower that FAST-BRIEF, but gives nice results.
- FFME: This method is a SIFT-like one, but specifically designed for egomotion computation. The key idea is that it avoids some of the steps SIFT gives, so that it runs faster, at the cost of not being so robust against scaling. The good news is that in egomotion estimation the scaling is not so critical as in registration applications, where SIFT should be selected. You can find more details, the paper and so on at the author’s website https://sites.google.com/site/compvis/home
Personally, I prefer not so many features, but very distinctive ones, but, at the same time I like algorithms to run fast. So I would choose SIFT for its robustness, but not use it for being quite slow. Definitely I will not use it if I had to pay (remember, SIFT is nonfree!). I’ve been using FAST-BRIEF and ORB for some time, with good results, but some times they give me too many outliers, so I have to construct RANSAC layers to filter them out.
My choice is, therefore FFME. It is almost as robust as SIFT, and slightly faster. Last but not least, it is free. It gives pretty distributed detections (as opposed to FAST or ORB that sometimes give too much features in very small regions), which is very good for egomotion estimation.
You can see a video of its performance in a sequence I’ve recorder with my car (see below to get the source code):
FFME is a creation of Carlos Roberto del Blanco (http://www.gti.ssr.upm.es/~cda), who provided the source code freely. I have created a C++ wrapper that can be used with the OpenCV 2.x API, as well as the required modifications to compile FFME with CMake.
- Link to the original source code by Carlos Roberto del Blanco: https://sites.google.com/site/compvis/code/Motion-estimation-feature-correspondence
- Link to the modified source code (OpenCV 2.x C++ wrapper + CMake) by Marcos Nieto. (https://sourceforge.net/projects/ffme/). The sample contains two folders: /c corresponds to the original code by Carlos Roberto del Blanco with CMakeLists.txt for its compilation with CMake. The /cpp folder contains the full OpenCV 2.x wrapper I did, with the comparison of SIFT, FAST, ORB and FFME, and the creation of the video.
Hope you like it!! Ah, please, if you finally publish something and use FFME, don’t forget to add a reference to the great work of Carlos Roberto:
C.R. del Blanco, F. Jaureguizar, L. Salgado, N. García, “Motion estimation through efficient matching of a reduced number of reliable singular points”, SPIE Real-Time Image Processing 2008, San Jose (CA), USA, SPIE vol. 6811, pp. 68110N-1-12, 28-29 Jan. 2008. (DOI 10.1117/12.768125)