I am working with low resolution (VGA) and jpg-compressed sequences of images for visual navigation on a mobile robot. At the moment I am using SURF for detecting keypoints and extracting descriptors out of the images, and FLANN for tracking them. I am getting 4000-5000 features per image, and usually 350-450 matches are made per pair of consecutive images, before applying RANSAC (which usually reduces 20% the number of matches)
I am trying to increase the number (and quality) of the matches. I have tried two other detectors: SIFT and ORB. SIFT increases the number of features noticeably (35% more of tracked features, overall), but it is much slower. ORB extracts roughly as many features as SURF, but the matching performance is much poorer (~100 matches, in the best cases). My implementation in opencv of ORB is:
cv::ORB orb = cv::ORB(10000, 1.2f, 8, 31);
orb(frame->img, cv::Mat(), im_keypoints, frame->descriptors);
frame->descriptors.convertTo(frame->descriptors, CV_32F); //so that is the same type as m_dists
And then, when matching:
cv::Mat m_indices(descriptors1.rows, 2, CV_32S);
cv::Mat m_dists(descriptors1.rows, 2, CV_32F);
cv::flann::Index flann_index(descriptors2, cv::flann::KDTreeIndexParams(6));
flann_index.knnSearch(descriptors1, m_indices, m_dists, 2, cv::flann::SearchParams(64) );
What is the best feature detector and extractor when working with low resolution and noisy images? Should I change any parameter in FLANN depending on the feature detector used?
EDIT:
I post some pictures of a fairly easy sequence to track. The pictures are as I give them to the feature detector methods. They have been preprocessed to eliminate some noise (by means of cv::bilateralFilter()
)
If you have control of the feature you track you can it them rotation invariant and use correlation.