Commit a97a2c90 authored by Davis King's avatar Davis King

simplified SURF example program

parent 9160565f
// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt // The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
/* /*
This is a simple example illustrating the use of the get_surf_points() This is a simple example illustrating the use of the get_surf_points() function. It
function. It pulls out the first 100 SURF points from an input image pulls out SURF points from an input image and displays them on the screen as an overlay
and displays them on the screen as an overlay on the image. on the image.
For a description of the SURF algorithm you should consult the following For a description of the SURF algorithm you should consult the following papers:
papers:
This is the original paper which introduced the algorithm: This is the original paper which introduced the algorithm:
SURF: Speeded Up Robust Features SURF: Speeded Up Robust Features
By Herbert Bay, Tinne Tuytelaars, and Luc Van Gool By Herbert Bay, Tinne Tuytelaars, and Luc Van Gool
...@@ -18,7 +17,7 @@ ...@@ -18,7 +17,7 @@
#include <dlib/gui_widgets.h> #include <dlib/image_keypoint/draw_surf_points.h>
#include <dlib/image_io.h> #include <dlib/image_io.h>
#include <dlib/image_keypoint.h> #include <dlib/image_keypoint.h>
#include <fstream> #include <fstream>
...@@ -40,53 +39,35 @@ int main(int argc, char** argv) ...@@ -40,53 +39,35 @@ int main(int argc, char** argv)
return 1; return 1;
} }
// Here we declare an image object that can store rgb_pixels. Note that in // Here we declare an image object that can store rgb_pixels. Note that in dlib
// dlib there is no explicit image object, just a 2D array and // there is no explicit image object, just a 2D array and various pixel types.
// various pixel types.
array2d<rgb_pixel> img; array2d<rgb_pixel> img;
// Now load the image file into our image. If something is wrong then // Now load the image file into our image. If something is wrong then load_image()
// load_image() will throw an exception. Also, if you linked with libpng // will throw an exception. Also, if you linked with libpng and libjpeg then
// and libjpeg then load_image() can load PNG and JPEG files in addition // load_image() can load PNG and JPEG files in addition to BMP files.
// to BMP files.
load_image(img, argv[1]); load_image(img, argv[1]);
// get the 100 strongest SURF points from the image // Get SURF points from the image. Note that get_surf_points() has some optional
std::vector<surf_point> sp = get_surf_points(img, 100); // arguments that allow you to control the number of points you get back. Here we
// simply take the default.
std::vector<surf_point> sp = get_surf_points(img);
cout << "number of SURF points found: "<< sp.size() << endl;
// create a window to display the input image and the SURF boxes. (Note that if (sp.size() > 0)
// you can zoom into the window by holding CTRL and scrolling the mouse wheel)
image_window my_window(img);
// Now lets draw some rectangles on top of the image so we can see where
// SURF found its points.
for (unsigned long i = 0; i < sp.size(); ++i)
{ {
// Pull out the info from the SURF point relevant to figuring out // A surf_point object contains a lot of information describing each point.
// where its rotated box should be. This is the box it extracted // The most important fields are shown below:
// the SURF descriptor vector from. cout << "center of first SURF point: "<< sp[0].p.center << endl;
const unsigned long box_size = static_cast<unsigned long>(sp[i].p.scale*20); cout << "pyramid scale: " << sp[0].p.scale << endl;
const double ang = sp[i].angle; cout << "SURF descriptor: \n" << sp[0].des << endl;
const point center(sp[i].p.center);
const rectangle rect = centered_rect(center, box_size, box_size);
// Rotate the 4 corners of the rectangle
const point p1 = rotate_point(center, rect.tl_corner(), ang);
const point p2 = rotate_point(center, rect.tr_corner(), ang);
const point p3 = rotate_point(center, rect.bl_corner(), ang);
const point p4 = rotate_point(center, rect.br_corner(), ang);
// Draw the sides of the box as red lines
my_window.add_overlay(p1, p2, rgb_pixel(255,0,0));
my_window.add_overlay(p1, p3, rgb_pixel(255,0,0));
my_window.add_overlay(p4, p2, rgb_pixel(255,0,0));
my_window.add_overlay(p4, p3, rgb_pixel(255,0,0));
// Draw a line from the center to the top side so we can see how the box is oriented.
// Also make this line green.
my_window.add_overlay(center, (p1+p2)/2, rgb_pixel(0,255,0));
} }
// Create a window to display the input image and the SURF points. (Note that
// you can zoom into the window by holding CTRL and scrolling the mouse wheel)
image_window my_window(img);
draw_surf_points(my_window, sp);
// wait until the user closes the window before we let the program // wait until the user closes the window before we let the program
// terminate. // terminate.
my_window.wait_until_closed(); my_window.wait_until_closed();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment