This project implements keypoint detectors, descriptors, and methods to match them between successive images. It tracks features from a vehicle-mounted camera for use in tasks like localization, mapping, and object recognition.
- cmake >= 3.14
- make >= 4.1 (Linux, Mac), 3.81 (Windows)
- OpenCV >= 4.1
- gcc/g++ >= 8.0
- Clone this repo.
- Make a build directory in the top level directory:
mkdir build && cd build - Compile:
cmake .. && make - Run it:
./2D_feature_tracking.
We successfully implemented a ring buffer to hold the last N (N = 2) images and reuse them within the data pipeline.
We have implemented detectors such as SHITOMASI, HARRIS, FAST, BRISK, ORB, AKAZE, and SIFT which can be selected by setting a string accordingly.
We removed all keypoints outside of a pre-defined rectangle, that encompasses the target car, and only used the keypoints within the rectangle for further processing.
Descriptors BRISK, BRIEF, ORB, FREAK, AKAZE, and SIFT have been implemented and made selectable by setting a string accordingly.
FLANN matching and k-nearest neighbor selection were implemented and can be selected using the respective strings in the main function.
K-Nearest-Neighbor matching is used to implement the descriptor distance ratio test, which looks at the ratio of best vs. second-best match to decide whether to keep an associated pair of keypoints.
The results of the implementation are located in "results/keypoint_data.csv", for statistcs related to keypoint detection, and "results/match_data.csv", for statistics related to keypoint-descriptor matches.
The top 3 detector/descriptor combinations as per the performance evaluation, considering the number of keypoints detected, number of matches and time taken, are:
- FAST + BRIEF
- AKAZE + BRIEF
- FAST + ORB
This project successfully implements the necessary components for 2D feature tracking. It provides flexibility in choosing different detectors and descriptors and evaluates their performance in terms of speed and matching accuracy. The best-performing combinations are recommended based on the application's needs for real-time processing and reliable feature matching.