Due: Tuesday, Feb 20 by 11:50pm.
In this project, you will write code to detect discriminating features in an image and find the best matching features in other images. You will use the Harris corner detector to find features and will try 2 variations of descriptors for matching.
To help you visualize the results and debug your program, we provide a working user interface that displays detected features and best matches in other images. We also provide sample feature files that were generated using SIFT, the current best of breed technique in the vision community, for comparison. You are NOT expected to implement SIFT.
The project has three parts. Firstly you will write the interest point detection function. Next you will form descriptor vectors for each your interest points. Finally, using the skeleton code provided, you will use your feature detector/descriptor to find matches in an image database, and evaluate the results.
NOTE that the Harris operator and the descriptors work with gray-scale images, so you'll need to convert. Both detection and description use gray tones. You'll also notice that the package we give you converts the input images to a different representation needed by the user interface. That part is done for you.
In this step, you will identify points of interest in the image using the Harris corner detection method.
For each point in the image, consider a 5 X 5 window of pixels around that point. Compute the Harris matrix M for that point, defined as
To find interest points, compute the corner response R
(Try k = 0.05)
Once you've computed R for every point in the image, choose points where R is above a threshold and is a local maximum in at least a 3x3 neighborhood.
You can test that your features are firing in sensbile locations by loading the featurefile generated from cse455 computeFeatures into the GUI (see Testing section)
If you wish to know the reasoning behind this corner detecting algorithm, read the Harris paper .Now that you've identified points of interest, the next step is to implement a descriptor for the feature centered at each interest point. This descriptor will be the representation you'll use to compare features in different images to see if they match.
Now that you've detected and described your features, the next step is to match them, i.e., given a feature in one image, find the best matching feature in one or more other images.
Skeleton code has been provided that finds the SSD between all feature descriptors in a pair of images. The code declares a match between each feature and it's best match (nearest neighbour) in the second image. We have also provided ground truth homographies between the images, so that you can test how well your matching is working using cse455 testMatch (see Testing section).
Now you're ready to go! Using the UI and C++ skeleton code that we provide, you can load in a set of images, view the detected features, and visualize the feature matches that your algorithm computes.
We are providing a set of benchmark images to be used to test the performance of your algorithm as a function of different types of controlled variation (i.e., rotation, scale, illumination, perspective, blurring). For each of these images, we know the correct transformation and can therefore measure the accuracy of each of your feature matches. This is done using a routine that we supply in the skeleton code.
Download some image sets: leuven, bikes
Included with these images are
Get access to FLTK. (Here are local
copies for
windows and linux, but see below
about using it on linux.) **disclaimer** the skeleton code was designed to be
used with FLTK-1. It has not been tested with FLTK-2.
On Windows you'll need
to install it yourself.
Unzip it to the directory above your project directory; in other words if your
homework is in C:\CSE455\project3, then put FLTK in C:\CSE455\fltk-1.1.4.
Otherwise you'll have to change the project settings to look for the
include and library files in the correct location.
If you're using Linux on
one of the CSE department machines, you don't need to download FLTK, since you
can just use the
libraries already
installed and
accessible from your
machine at the location
specified in the Makefile. If you already have FLTK or are installing it in
/usr/local, here are
fltk installation instructions and an alternate Makefile
for the skeleton code.
Download the C++ skeleton
code:
For Visual Studio 2003
For Visual Studio 2005
For Linux
After compiling and linking the skeleton code, you will have an executable cse455. This can be run in several ways:
cse455
with no command line options starts the GUI. Inside the GUI, you can load a
query image and its corresponding feature file, as well as an image database
file, and search the database for the image which best matches the query
features. You can use the mouse buttons to select a subset of the features to
use in the query. To select a rectangular region, click and drag the right
mouse button over some of the feature locations. Start by loading a query
image, "File->Load Query Image" e.g. img1.ppm and query features
"File->Load Query Features" e.g. img1.key. Next, load a feature database
"File->Load Image Database" e.g. img2.kdb. Finally, select a set of features
and use "Image->Perform Query" to show the matches. Note that a database
file is really just a link to the image and its corresponding features i.e.
img1.kdb contains something like "img1.ppm im1.key". The simplest way to test
your features is to name them "img1.key" etc. and copy your ".key" files in
place of the SIFT ones (back up the SIFT ones first, you will need them later).
cse455 computeFeatures imagefile featurefile [featuretype]
uses your feature detection routine to compute the features for imagefile,
and writes them to featurefile. featuretype can be used to
specify different types of features to compute (optional).
cse455 testMatch featurefile1 featurefile2 homographyfile [matchtype]
uses your feature matching routine to match the features in featurefile1
with the features in featurefile2. homographyfile contains the
correct transformation between the points in the two images, specified by a
3-by-3 matrix. matchtype can be used to specify different matching
algorithms to use (optional). This function returns the percentage of correct
matches (number of inliers / number of feature matches).
cse455 testSIFTMatch featurefile1 featurefile2 homographyfile [matchtype]
is the same as above, but uses the SIFT file format.
cse455 benchmark imagedir [featuretype matchtype]
tests your feature finding and matching for all of the images in one of the
four above sets. imagedir is the directory containing the image (and
homography) files. This command will return the average percentage correct
matches when matching the first image in the set with each of the other five
images.
The only code you need to write is for your feature detection and description methods. You only need modify the functions ComputeHarris() and ExtractDescriptor() at the end of the file "features.cpp". These functions are called from "dummyComputeFeatures()" in the same file.
In addition to your source code and executable, turn in a report describing your experiments and results. In particular:
This report can be a Word document or pdf document. Email Masa your writeup and your source code by Tuesday Feb 20 at 11:59pm. Please include "455 project 3" in the subject of the email. Please include your name in the name of your writeup file.