Why is SIFT faster than SURF ? It shouldn't be.
I'm working on my thesis and I measured times it takes for each algorithm SIFT and SURF to find a match. I know that SURF was designed to be faster than SIFT, but my measures revealed the opposite. The measure test is running with 20 images from very small to very big, from black and white to very colorful. The tests show, that SIFT is twice as fast as SURF I'm using OpenCV-2.4.8 with Java interface and FLANNBASED descriptor matcher. I'm not the only one who notice this, for example here is another one, but without answer: link
How can I explain this in my thesis ?
Do they process the same amount of keypoints?
Nope, SIFT process even more features than SURF. My results: SURF: 269 667 features in 98,038 seconds SIFT: 336 437 features in 55,27 seconds
Hm, and what about the parameters? Same number of octaves, etc? Probably you should also compare the binaries of the authors (if they exist) instead of the OpenCV versions, but even then the complexity (O-notation) counts, not the actual runtime.
No, in average SURF keypoints return many 0 octaves, few 1 and very few 2 octaves. On the other hand SIFT returns big octave numbers with seven and eight digits. As far as I know SIFT and SURF is implemented in OpenCV according to patent and can be used for free for non-commercial use only. So it should be the same as original, or am I wrong ?
With parameters, I meant the algorithm-parameters, like 'nOctaveLayers', etc. OpenCV provides re-implementations of the algorithms, they might be very very similar, but are not from the authors themselves, so no guarantee here! The author provide their versions here: http://www.cs.ubc.ca/~lowe/keypoints/ and http://www.vision.ee.ethz.ch/~surf/download.html . And yes, if you use them commercially, you have to be careful with the patent.
Is it SURF which became slower or it's SIFT which has been speeded-up?
OpenCV doesn't want any of these parameters. At least not in Java interface. I just choose detector and descriptor method (SIFT or SURF) and then match their descriptors.
You cannot set them directly, however there exist a workaround, see http://answers.opencv.org/question/3167/java-how-to-set-parameters-to-orb-featuredetector/ , again imho you should compare the author's code. Also others (e.g. http://computer-vision-talks.com/articles/opencv-is-not-a-panacea/ ) mention that the OpenCV's implementation is pretty slow!