Even though SURF is faster than SIFT, it's just not fast enough for a real-time system, especially when there are resource constraints. When you are building a real-time application on a mobile device, you won't have the luxury of using SURF to do computations in real time. We need something that's really fast and computationally inexpensive. Hence, Rosten and Drummond came up with FAST. As the name indicates, it's really fast!
Instead of going through all the expensive calculations, they came up with a high-speed test to quickly determine if the current point is a potential keypoint. We need to note that FAST is just for keypoint detection. Once keypoints are detected, we need to use SIFT or SURF to compute the descriptors. Consider the following image:
If we run the FAST keypoint detector on this image, you will see something like this:
If we clean it up and suppress the unimportant keypoints, it will look like this:
Following is the code for this:
import cv2 import numpy as np gray_image = cv2.imread('input.jpg', 0) fast = cv2.FastFeatureDetector() # Detect keypoints keypoints = fast.detect(gray_image, None) print "Number of keypoints with non max suppression:", len(keypoints) # Draw keypoints on top of the input image img_keypoints_with_nonmax = cv2.drawKeypoints(gray_image, keypoints, color=(0,255,0)) cv2.imshow('FAST keypoints - with non max suppression', img_keypoints_with_nonmax) # Disable nonmaxSuppression fast.setBool('nonmaxSuppression', False) # Detect keypoints again keypoints = fast.detect(gray_image, None) print "Total Keypoints without nonmaxSuppression:", len(keypoints) # Draw keypoints on top of the input image img_keypoints_without_nonmax = cv2.drawKeypoints(gray_image, keypoints, color=(0,255,0)) cv2.imshow('FAST keypoints - without non max suppression', img_keypoints_without_nonmax) cv2.waitKey()